-->
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.  [ 5 posts ] 
Author Message
 Post subject: Finale Attribute? Klassen ohne Standardkonstruktor?
PostPosted: Fri Dec 21, 2007 12:52 pm 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hi, da ich ein finales Attribut brauche, dass im Konstruktor gesetzt wird, würde ich gerne wissen, ob man Hibernate so konfigurieren kann, dass es diesen Konstruktor anstatt dem nicht vorhandenen Standardkonstruktor benutzt. Falls ja, wie (Annotation)?

Ist @Immutable eine Lösung?

Vgl. XMLEncoder Customizing Instantiation --
Constructors whose arguments are properties
http://java.sun.com/products/jfc/tsc/articles/persistence4/


Bei Klassen, die ich nach dem immutable Pattern implementiert habe, also keine setter-Methoden haben und alle Attribute im Konstruktor gesetzt werden, benutze @Entity(mutable=false).



Vielen Dank.

Viele Grüße Michael


Top
 Profile  
 
 Post subject: Re: Finale Attribute? Klassen ohne Standardkonstruktor?
PostPosted: Wed Jan 02, 2008 1:20 pm 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Urmech wrote:
Hi, da ich ein finales Attribut brauche, dass im Konstruktor gesetzt wird, würde ich gerne wissen, ob man Hibernate so konfigurieren kann, dass es diesen Konstruktor anstatt dem nicht vorhandenen Standardkonstruktor benutzt. Falls ja, wie (Annotation)?
(...)


Hallo Urmech,

Hibernate braucht immer einen Default-Konstruktor (jeder andere JPA-Provider auch)! Grund: wenn Hibernate bspw. ein Objekt einer Klasse auf Basis eines DB-Datenbanksatz erzeugen soll, verwendet es dazu die Reflection-API
Code:
Class.newInstance()
- und diese verlangt einen Default-Konstruktor.

Was du aber willst, ist dass deine ANWENDUNG immer nur den Konstruktor mit dem finalen Attributwert verwendet. Das kann man dann so machen, dass nur dieser Konstruktur
Code:
public
ist, der von Hibernate verwendete kann
Code:
package protected
sein. Dein Attribut ist dann final, wenn es auch keinen erreichbaren Setter für es gibt.

Ciao, Carlo.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 02, 2008 2:42 pm 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Hi Carlo,

dass Problem ist, dass ich gerne final benutzten würde, um auch versehentliche Änderungen in der selben Klasse zu verhindern. (Meine Eclipse -Einstellungen machen das eh automatisch, wenn keine Zuweisung außerrhalb der Konstruktoren erfolgt.)

Wenn ich einen privaten Standardkonstruktor benutze und das Feld mit einem nicht sinnvollen Wert initialisiere, gibt das wahrscheinlich auf Grund der finalen Eigenschaft beim setzen durch Hibernate (braucht ja nicht unbedingt getter und setter, bei Property-Access) Probleme.

Einfach auf final zu verzichten, wäre die infachste Lösung, aber leider halt unsauber.

Der Hinweiß auf die Einschränkungen der Reflection-Api ist zumindest seit Java5 nicht ganz korrekt, denn durch

Code:
getConstructor(Class<?>... parameterTypes)
in
Code:
java.lang.Class<T>
und
Code:
public T newInstance(Object... initargs)
in
Code:
java.lang.reflect.Constructor<T>


solte ein Aufruf eines nicht Standardkonstruktors problemlos möglich sein, wenn Hibernate das Attribut bzw. die Signatur kennt.

Viele Grüße Michael


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 07, 2008 12:16 pm 
Regular
Regular

Joined: Thu Apr 14, 2005 10:39 am
Posts: 115
Laut

http://forum.hibernate.org/viewtopic.php?t=982531

wäre so etwas möglich, wird aber von Hibernate leider nicht unterstützt.


Viele Grüße Michael


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 08, 2008 1:44 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Hibernate erwartet aber einen Konstruktor ohne Parameter aufrufen zu können.

Field Access wäre eine Lösung (und der übliche Weg), dann setzt Hibernate ein privates Attribut direkt ohne den Setter zu verwenden. Ich habe es noch nicht probiert, aber Du könntest versuchen das Attribut dann auf Final zu setzen.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 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.