Thursday, November 02, 2006

GenericRCP 0.3.0 veröffentlicht

Seit kurzem haben wir die neueste Version des GenericRCPs veröffentlicht.

Mit der neuen Version können nun auch Hibernate JPA annotierte Klassen gelesen werden. Des weiteren haben wir die Möglichkeit der grafischen Anpassungen weiter ausgebaut.

Mehr dazu auf der offiziellen GenericRCP Homepage.

An alle AppFuser: Auch Matt Raible hat über unser Tool einen kleinen Blogbeitrag geschrieben.

XDoclet und das Äquivalent in JPA

Da nun mit Hibernate Annotations eine lauffähige Implementierung des JPA Standards verfügbar ist, wird es nun langsam Zeit, von den alten XDoclet Tags abschied zu nehmen.

 

Um den Umstieg zu erleichtern, versuchen wir hier eine Liste anzulegen, welche Annotations für welche XDoclet Tags zu verwenden sind.

@hibernate.class -> @Entity

Bsp:

@hibernate.class table="testtabelle"

wird zu

@Entity(name="testtabelle")

Dokumentation

@hibernate.property -> <Gibt es so nicht mehr>

JPA mapped automatisch alle Attribute einer Klasse, die nicht transient sind. Allerdings kann man wie immer einem Attribut noch genauere Angaben über Länge, Typ etc. mitgeben.

Bsp:

@hibernate.property column="spaltenname" length="100" not-null="true"

wird zu

@Column(name="spaltenname", nullable=false, length=100)

Domumentation

@hibernate.many-to-one -> @ManyToOne

Bsp:

@hibernate.many-to-one name="library" column="libraryId" class="org.bambo.library.model.facility.Library" not-null="true"

wird zu

@ManyToOne(optional=false)

Will man den genauen Namen der Spalte angeben, so muss man noch eine zusätzliche Annotation angeben:  @JoinColumn(name="libraryid")

Dokumentation

@hibernate.collection-one-to-many -> @OneToMany

Im Gegensatz zu XDoclet muss man bei den Annotations fast keine zusätzlichen angaben mehr machen. Wichtig is nur, dass zusätzlich zu der Annotation noch angegeben wird, welches Attribut in der Klasse der anderen Seite der Assiozation diese Collection repräsentiert. Dies geschieht durch das Annotationattribut mappedBy(<Attributname>).

Bsp:

 @hibernate.set name="shelfs" lazy="true" inverse="true"
 @hibernate.collection-key column="libraryId"
 @hibernate.collection-one-to-many class="org.bambo.library.model.facility.Shelf"

wird zu

@OneToMany(mappedBy="library")

("library", da das Attribut in der Klasse Shelf, welches mit dieser Collection korrespondiert, "library" heißt).

Dokumentation

@hibernate.collection-many-to-many -> @ManyToMany

Bsp:

 

@hibernate.set name="authors" table="book_author" lazy="true"
@hibernate.collection-key column="bookId"
@hibernate.collection-many-to-many class="org.bambo.library.model.user.Author" column="authorId"

wird zu

@ManyToMany

Verwendet man ungetypte Collections, so muss die Annotation noch um das Attribut (targetEntity=org.bambo.library.model.user.Author.class) erweitert werden.

Will man noch den genauen namen der JoinTabelle angeben, so muss man die zusätliche Annotation @JoinTable(name="authors") angeben.

Die Markierung inverse gibt es in JPA nicht mehr. Statt dessen gibt man der Annotation das Attribut (mappedBy="<Attributname der collection in der anderen Klasse>") an

Dokumentation

 

Weitere Informationen über JPA Annotations findet man auf dieser Oracle Seite und natürlich auf der

J2EE Referenz Seite