Annotation von Entity Beans nur an der Methode

Java4U

Grünschnabel
Hi All,

Ich weiß nicht ob Ihr das eventuell schon wusstet. Man sollte in einer Entity Bean die Annotations wie @Column, @ManyToOne usw. immer nur am getter machen.


Bei JBoss 4.2.3 habe ich aktuell die Entdeckung gemacht, dass die Annotation
Code:
   @Column(name = "NAME", unique = true, nullable = false)
    public String name;
am Field kein Datenbank-Constraint erstellte.


Sobald ich die Annotation zur Getter-Methode verschoben habe aber hat mir JBoss bzw. Hibernate den Constraint angelegt.
Code:
    @Column(name = "NAME", unique = true, nullable = false)
    public String getName() {
        return name;
    }

Keine Ahnung ob es sich hier um einen JBoss, Hibernate oder JPA Bug handelt.


Etwas ähnliches ist mir mit JAXB auch schon mal aufgefallen: Entity Beans --> XML

Also ich werde in Zukunft meine Annotations nur noch am Getter machen.

Gruß

Java4U
 
Das hängt vom verwendeten PersistenceProvider ab. In JAXB steuerst du das Verhalten über @XmlAccessorType.

Bist du dir sicher, dass nur der Constraint nicht klappte? Du hast halt den Tabellennamen redundant angegeben (was du dir eigentlich sparen kannst). Wenn du da einen anderen Namen angibst, wird der dann übernommen oder wird die komplette Annotation misachtet? IMHO ist dann dein PersistenceProvider falsch konfiguriert, oder es ist ein Bug.

Ich persönlich finde Annotationen an Properties sauberer, da sie ei Implementierungsdetail sind und eigentlich nicht an die öffentliche API gehören. Klar macht das keinen wirklichen Unterschied. Ausserdem verteilen sich Annotationen an Methoden ziemlich weit in der Klasse. An Properties sind sie mehr an einer Stelle. Aber wie gesagt, das istr Geschmacksfrage. Wichtig ist im Endeffekt nur, sich für eine Variante zu entscheiden und keinen Mischmasch zu betreiben.

Gruß
Ollie
 
Ich finde die Annotations an den Properties auch viel übersichtlicher. Da sieht man auf einen Blick wo was drinsteckt.

Aber Du hast Recht meine komplette @Columns Annotation wird misachtet.

Wenn ich
Code:
    @Column(name = "XYZ", nullable = false, unique = true)
    private String name;

schreibe wird trotzdem nur die Tabelle mit der Spalte "NAME" erstellt.

Meine Properties in der persistence.xml sehen soweit ganz normal aus.

Code:
<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.show_sql" value="true" />
</properties>


ich habe das ganze auch schon mal mit
Code:
<property name="hibernate.hbm2ddl.auto" value="create-drop" />

versucht, selbes Ergebnis.

Gruß

Java4U
 
Zurück