-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: boolean vs Boolean, int vs Integer
PostPosted: Wed Jun 25, 2008 3:07 am 
Regular
Regular

Joined: Tue Jun 03, 2008 1:12 pm
Posts: 84
Location: germany
Hallo,

was ist denn 'best-practice', um mit folgendem umzugehen:

Ich hab eine Entity-Bean mit einem primitiven Datentyp:

Code:
private boolean enabled;

@Column(name = "ENABLED", nullable = true)
public boolean isEnabled() {
   return enabled;
    }

public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }


in DB2 hat das Feld "ENABLED" den Datentyp SMALLINT (das soll auch so bleiben).

In meiner View referenziere ich nun wie folgt:

Code:
<h:outputLabel for="selectEnabled" value="Select Enabled"/>
<h:selectBooleanCheckbox value="#{sessionBean.enabled}" id="selectEnabled"/>


(selectBooleanCheckbox benötigt den primitiven Datentyp boolean)

Nun bekomme ich vom Hibernate folgende Fehlermeldung:

Code:
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of ...


Daraufhin hab ich den Datentyp in der Entity-Bean von boolean auf java.lang.Boolean geändert:

Code:
private Boolean enabled;

@Column(name = "ENABLED", nullable = true)
public Boolean isEnabled() {
   return enabled;
    }

public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }


Es gibt nun keine Fehlermeldung von Hibernate, aber meine Checkbox funzt jetzt leider nicht. Ich bekomm folgende Fehlermeldung:

Code:
javax.el.PropertyNotFoundException: /make.xhtml @84,85 value="#{Bean.enabled}": Property 'enabled' not readable on type java.lang.Boolean


so, nun habe ich nur den Rückgabewert der Propertie von Boolean auf boolean gecastet (return enabled.booleanValue();) :

Code:
private Boolean enabled;

@Column(name = "ENABLED", nullable = true)
public boolean isEnabled() {
   return enabled.booleanValue();
    }

public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }


Leider ohne Erfolg - folgende Fehlermeldung erscheint:

Code:
javax.faces.FacesException: javax.el.ELException: /main.xhtml @84,85 value="#{Bean.enabled}": Error reading 'enabled' on type Bean
..
Caused by: java.lang.NullPointerException
   at Bean.isEnabled(Bean.java:258)


Mit dem Cast "return (boolean) enabled;" bekomm ich dieselbe Fehlermeldung.

Daraufhin hab ich nun mit Autoboxing den Wert boolean nur in der setter-Methode zu einem Boolean gecastet:

Code:
    public void setEnabled(Boolean enabled) {
      this.enabled = enabled;
    }


Ich bekomme nun diese Fehlermeldung:
Code:
org.hibernate.PropertyAccessException: Exception occurred inside setter of Bean.enabled


Wenn ich nun folgendes mache, dann kommt keine Fehlermeldung:

Code:
public void setEnabled(Boolean pwexpire) {
pwexpire = this.pwexpire;
//     this.pwexpire = pwexpire;

    }
ABER: pwexpire = this.pwexpire; wäre doch für ein setter FALSCH!


Ist das Autoboxing (Cast) falsch?
Was soll ich nun machen? Ich kanns drehen und wenden, beide Seiten beschweren sich!!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 25, 2008 5:40 am 
Regular
Regular

Joined: Tue Jun 03, 2008 1:12 pm
Posts: 84
Location: germany
I hab nun das gemacht:

Code:
private Boolean enabled;


@Column(name = "ENABLED", nullable = true)
public boolean isEnabled() {
// cast from Boolean to boolean
return pwexpire.booleanValue();
    }

public void setEnabled(Boolean enabled) {
        this.enabled= enabled;
    }


Der Fehler erscheint:

Code:
javax.el.ELException: /main.xhtml @84,85 value="#{Bean.enabled}": Error reading 'enabled' on type Bean


grrr...

Ich kann ja verstehen, das Hibernate die Wrapper-Typen benötigt, da diese mit "Null"-Werten referenzierbar sind, aber wie soll man dann das mit dem Cast machen? casten im getter oder im setter, oder seh ich da irgendwas falsch?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 25, 2008 6:48 am 
Regular
Regular

Joined: Tue Jun 03, 2008 1:12 pm
Posts: 84
Location: germany
hab das nun so gemacht:

Code:
private Boolean enabled=false;

    @Column(name = "ENABLED", nullable = true)
    public boolean isEnabled() {
        return enabled.booleanValue();
    }


    public void setEnabled(Boolean enabled) {
        this.enabled= enabled;

    }


Es erscheint nun keine Fehlermeldung mehr. Aber kommt mir n bissl komisch vor... Habe "private Boolean enabled=false" gesetzt...is dass denn so okay?? Das is doch total unlogisch, was hab ich denn dadurch gewonnen, wenn ich mein Wrapper auf false setzten muss..dann kann ich ja gleich nen primitiven Typen auf false setzen..und auf nen Wrapper verzichten.!!!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 25, 2008 9:10 am 
Regular
Regular

Joined: Thu Mar 06, 2008 5:06 am
Posts: 68
Hi,
da dein enabled mit NULL umgehen können muss, ist das schon notwendig. Hibernate muss die NULL ja zuweisen können. Wenn du aber immer einen nicht-NULL-Wert haben willst, solltest du isEnabled so implementieren:

Code:
private Boolean enabled;

@Column(name = "ENABLED", nullable = true)
public boolean isEnabled() {
        return enabled == null ? false : enabled;
}


So bist du auf der sicheren Seite und bekommst immer false, wenn enabled NULL ist - auch, wenn bei setEnabled mal NULL zugewiesen werden sollte.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 25, 2008 10:37 am 
Regular
Regular

Joined: Tue Jun 03, 2008 1:12 pm
Posts: 84
Location: germany
hmm..klingt logisch:-)

hab das nun so gemacht:

Code:
private Boolean enabled=null;

@Column(name = "ENABLED", nullable = true)
   
public boolean isEnabled() {
        return enabled == null ? false : enabled;
}

    public void setEnabled(boolean enabled) {
        this.enabled= enabled;
}


bekomme nun dennoch diese Fehlermeldung:

Code:
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of Bean.enabled


Wrapper-Klassen, wie Boolean können ja über Cast oder Outboxing in primitive Datentypen konvertiert werden.

Wo muss ich denn den Cast ansetzten. Eigentlich im Getter..oder??

Ich benötige den primitiven Datentyp 'boolean', um die Werte dann in meiner View der "h:selectBooleanCheckbox" übergeben zu können. Dass heißt, lesend soll die Property als boolean, und schreibend (wegen Hibernate Null-Value) als Boolean übergeben werden.

Oder mach ich da etwas grundsätzlich falsch?

danke für die Hilfe vorab.


Top
 Profile  
 
 Post subject: Re: boolean vs Boolean, int vs Integer
PostPosted: Thu Jun 26, 2008 10:20 am 
Beginner
Beginner

Joined: Sun Aug 22, 2004 11:00 am
Posts: 21
versuchen sie das folgende. vielleicht braucht deine view framework, einen traditionellen getter für booleans.

auf jeden fall, wenn deine DB spalte nullable ist, musst du eine Boolean (anstatt primitiv datentyp) verwenden. es hört sich an wie das problem in deinem view framework liegt.

Code:
private Boolean enabled;

@Column(name = "ENABLED", nullable = true)
public Boolean isEnabled() {
   return enabled;
}

public Boolean getEnabled(){
    return enabled;
}

public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
}

_________________
Ive got a Tomcat that Struts then Springs then Hibernates


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 27, 2008 2:28 am 
Regular
Regular

Joined: Tue Jun 03, 2008 1:12 pm
Posts: 84
Location: germany
SUPER!!!

ja, meine view hat einen traditionellen getter für booleans gebraucht.

habe nun isEnabled mit getEnabled ersetzt und jetzt funzt es.

ein ganz schön versteckter fehler, wenn man bedenkt, dass isEnabled lt. Spezi gleichwertig zu getEnabled is..

vielen dank!!!


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.