Hibernate Annotations: Eigene Sequenzen pro Klasse bei Vererbung
Bei der Arbeit mit Hibernate tritt häufiger das Problem auf, dass man bei vererbten Klassen pro Tabelle eine eigene Sequence (z.B. in Oracle) verwenden möchte bzw. muß. Man kann selbstverständlich die Id in jede Klasse packen und dort dann die entsprechenden Annotierungen anbringen. Das ist aber schlicht und ergreifend lässtig und wiederspricht dem OO Prinzip. Wenn man nun konsequent mit Vererbung arbeitet, ergibt es sich, dass meist eine Basis-Klasse entsteht und dort das Id Attribut enthalten ist.
1public class Base {
2 private Long Id;
3
4 public Long getId() {...}
5 ....
6}
7
8public class DerivedA extends Base {
9 private String name;
10 public String getName() { .... };
11}
12
13public class DerivedB extends Base {
14 private String position;
15 public String getPosition() { .... };
16}
Mit Hibernate möchte man selbstverständlich an der Geschichte nichts ändern, außer den Annotationen die für Hibernate wichtig sind.
1@MappedSuperclass
2public class Base {
3 private Long Id;
4
5 @Id
6 @GeneratedValue(generator = "hibseq")
7 public Long getId() {...}
8 ....
9}
10
11@Entity
12@Table(name = TableNames.TABLEA)
13@GenericGenerator(
14 name = "hibseq",
15 strategy = "sequence",
16 parameters = {@Parameter(name="sequence", value="SEQ_" + TableNames.TABLEA)}
17)
18public class DerivedA extends Base {
19 private String name;
20 public String getName() { .... };
21}
22
23@Entity
24@Table(name = TableNames.TABLEB)
25@GenericGenerator(
26 name = "hibseq",
27 strategy = "sequence",
28 parameters = {@Parameter(name="sequence", value="SEQ_" + TableNames.TABLEB)}
29)
30public class DerivedB extends Base {
31 private String position;
32 public String getPosition() { .... };
33}
Das Maven 2 PlugIn für Hibernate erzeugt dann aus den og. Klassen einen entsprechenden SQL (DDL) File:
1<plugins>
2 <plugin>
3 <groupId>org.codehaus.mojo</groupId>
4 <artifactId>hibernate3-maven-plugin</artifactId>
5 <version>2.0-SNAPSHOT</version>
6 <executions>
7 <execution>
8 <phase>process-classes</phase>
9 <goals>
10 <goal>hbm2ddl</goal>
11 </goals>
12 </execution>
13 </executions>
14
15 <configuration>
16 <componentProperties>
17 <jdk5>true</jdk5>
18 <packagename>com.soebes.hibernate.example</packagename>
19 <console>true</console>
20 <outputfilename>schema.sql</outputfilename>
21 <drop>true</drop>
22 <create>true</create>
23 <update>false</update>
24 <export>false</export>
25 <format>true</format>
26 </componentProperties>
27 </configuration>
28 </plugin>
29<plugins>