SINGLE_TABLE
TABLE_PER_CLASS
JOINED
@OneToMany
-Relation zu den Zutaten
(wie in den bisherigen Beispielen auch).@ManyToOne
-Relation zum Kuchen.SINGLE_TABLE
ZutatBaseInheritanceBean
: @Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@NamedQuery (name="findAllZutaten", query="select o from ZutatBaseInheritanceBean o")
public abstract class ZutatBaseInheritanceBean implements Serializable
{
private Integer intId;
private String strZutatName;
private KuchenInheritanceBean kuchen = null;
public ZutatBaseInheritanceBean()
{
}
@Column()
@Id ()
@GeneratedValue ()
public Integer getId()
{
return this.intId;
}
public void setId(Integer int_Id)
{
this.intId = int_Id;
}
@Column()
public String getZutatName()
{
return this.strZutatName;
}
public void setZutatName(String str_ZutatName)
{
this.strZutatName = str_ZutatName;
}
@ManyToOne ()
public KuchenInheritanceBean getKuchen()
{
return this.kuchen;
}
public void setKuchen (KuchenInheritanceBean kuchen)
{
this.kuchen = kuchen;
}
}
Die Strategie wird über die Annotation @Inheritance
definiert, als Typ haben wir hier InheritanceType.SINGLE_TABLE
gewählt.
Hier könnten Name und Typ der Discriminator Column über eine Annotation @DiscriminatorColumn
angegeben werden, ich belasse das hier beim Default
(resultiert in einer Spalte "DTYPE" in der Datenbank). ZutatFluessigkeitInheritanceBean
: @Entity
@DiscriminatorValue(value="fluessigkeit")
@Entity
@NamedQuery (name="findAllZutatenFluessigkeit", query="select o from ZutatFluessigkeitInheritanceBean o")
public class ZutatFluessigkeitInheritanceBean extends ZutatBaseInheritanceBean
{
private Integer intMasseinheitMenge;
private Masseinheit masseinheit;
@Column()
public Integer getMasseinheitMenge()
{
return this.intMasseinheitMenge;
}
public void setMasseinheitMenge(Integer int_MasseinheitMenge)
{
this.intMasseinheitMenge = int_MasseinheitMenge;
}
@Column()
@Enumerated(value=EnumType.STRING)
public Masseinheit getMasseinheit()
{
return this.masseinheit;
}
public void setMasseinheit(Masseinheit _masseinheit)
{
this.masseinheit = _masseinheit;
}
@Override
public String toString()
{
return this.getZutatName() + " (" + this.intMasseinheitMenge + " " + this.masseinheit + ")";
}
}
Hier wird zur Erkennung von Instanzen dieser Klasse in der Datenbank ein Wert der Discriminator Column mittels der Annotation @DiscriminatorValue
eingetragen:
alle Käsekuchen sollen hier den Wert "fluessigkeit" stehen haben. public enum Masseinheit
{
Liter,
Milliliter
}
Per Default werden Enum-Spalten mit ihren Integer-Werten in der Datenbank gespeichert. Da ich die Anzeigenamen der einzelnen Werte schöner finde,
habe ich die Enum-Speicherungsstrategie an der Property deklariert: @Enumerated(value=EnumType.STRING)
public Masseinheit getMasseinheit()
{
...
Default ist EnumType.ORDINAL
.ZutatGewichtInheritanceBean
aus: @Entity
@DiscriminatorValue(value="gewicht")
@NamedQuery (name="findAllZutatenGewicht", query="select o from ZutatGewichtInheritanceBean o")
public class ZutatGewichtInheritanceBean extends ZutatBaseInheritanceBean
{
private Integer intGewicht;
private Gewicht gewichtEinheit;
@Column()
public Integer getGewicht()
{
return this.intGewicht;
}
public void setGewicht(Integer int_Gewicht)
{
this.intGewicht = int_Gewicht;
}
public void setGewichtEinheit(Gewicht _gewichtEinheit)
{
this.gewichtEinheit = _gewichtEinheit;
}
@Column()
@Enumerated(value=EnumType.STRING)
public Gewicht getGewichtEinheit()
{
return this.gewichtEinheit;
}
@Override
public String toString()
{
return this.getZutatName() + " (" + this.intGewicht + " " + this.gewichtEinheit + ")";
}
}
Auch hier wird ein Discriminator Value gesetzt, und es wird eine spezielle Named Query deklariert die nur abzuwiegende Zutaten zurückliefert. ZutatStueckzahlInheritanceBean
: @Entity
@DiscriminatorValue(value="stueckzahl")
@NamedQuery (name="findAllZutatenStueckzahl", query="select o from ZutatStueckzahlInheritanceBean o")
public class ZutatStueckzahlInheritanceBean extends ZutatBaseInheritanceBean
{
private Integer intAnzahl;
@Column()
public Integer getAnzahl()
{
return this.intAnzahl;
}
public void setAnzahl(Integer int_Anzahl)
{
this.intAnzahl = int_Anzahl;
}
@Override
public String toString()
{
return this.getZutatName() + " (" + this.intAnzahl + " Stück)";
}
}
Der Discriminator Value wird auf "stueckzahl" gesetzt, und es wird eine spezielle Named Query deklariert die nur zählbare Zutaten zurückliefert. select z1_0.id,z1_0.DTYPE,z1_0.kuchen_id,z1_0.zutatName,z1_0.masseinheit,z1_0.masseinheitMenge,z1_0.gewicht,z1_0.gewichtEinheit,z1_0.anzahl from ZutatBaseInheritanceBean z1_0
TABLE_PER_CLASS
ZutatBaseInheritanceBean
: @Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@NamedQuery (name="findAllZutaten", query="select o from ZutatBaseInheritanceBean o")
public abstract class ZutatBaseInheritanceBean implements Serializable
{
...
}
Der Rest des Codes ist identisch mit dem vorherigen Beispiel (abgesehen von den DiscriminatorValue
-Annotations,
die hier in den Subklassen natürlich unsinnig wären. ZutatFluessigkeitInheritanceBean
, ZutatGewichtInheritanceBean
und ZutatStueckzahlInheritanceBean
unterscheiden sich nicht von den
Beans aus dem vorherigen Beispiel (abgesehen davon dass hier die Annotation @DiscriminatorValue
natürlich nicht verwendet werden darf)
und werden hier nicht nochmal wiederholt.KuchenTablePerClassBaseBean
wurde keine Tabelle erzeugt weil diese abstrakt ist. select z1_0.id,z1_0.clazz_,z1_0.kuchen_id,z1_0.zutatName,z1_0.masseinheit,z1_0.masseinheitMenge,z1_0.gewicht,z1_0.gewichtEinheit,z1_0.anzahl from
(
select gewicht, id, kuchen_id, gewichtEinheit, zutatName, null as masseinheitMenge, null as masseinheit, null as anzahl, 1 as clazz_ from ZutatGewichtInheritanceBean
union all
select null as gewicht, id, kuchen_id, null as gewichtEinheit, zutatName, masseinheitMenge, masseinheit, null as anzahl, 2 as clazz_ from ZutatFluessigkeitInheritanceBean
union all
select null as gewicht, id, kuchen_id, null as gewichtEinheit, zutatName, null as masseinheitMenge, null as masseinheit, anzahl, 3 as clazz_ from ZutatStueckzahlInheritanceBean
) z1_0
JOINED
KuchenJoinedBaseBean
: @Entity
@Inheritance(strategy=InheritanceType.JOINED)
@NamedQuery (name="findAllZutaten", query="select o from ZutatBaseInheritanceBean o")
public abstract class ZutatBaseInheritanceBean implements Serializable
{
...
}
Der Rest des Codes ist identisch mit dem Beispiel "SINGLE_TABLE". ZutatFluessigkeitInheritanceBean
, ZutatGewichtInheritanceBean
und ZutatStueckzahlInheritanceBean
unterscheiden sich nicht von den
Beans aus dem vorherigen Beispiel (abgesehen davon dass hier die Annotation @DiscriminatorValue
natürlich nicht verwendet werden darf)
und werden hier nicht nochmal wiederholt.select zutatbasei0_.id as id86_, zutatbasei0_.kuchen_id as kuchen3_86_, zutatbasei0_.zutatName as zutatName86_,
zutatbasei0_1_.gewicht as gewicht87_, zutatbasei0_1_.gewichtEinheit as gewichtE2_87_,
zutatbasei0_2_.masseinheit as masseinh1_88_, zutatbasei0_2_.masseinheitMenge as masseinh2_88_,
zutatbasei0_3_.anzahl as anzahl89_,
case when zutatbasei0_1_.id is not null then 1 when zutatbasei0_2_.id is not null then 2 when
zutatbasei0_3_.id is not null then 3 when zutatbasei0_.id is not null then 0 end as clazz_
from ZutatBaseInheritanceBean zutatbasei0_ left outer join ZutatGewichtInheritanceBean zutatbasei0_1_ on zutatbasei0_.id=zutatbasei0_1_.id left outer join
ZutatFluessigkeitInheritanceBean zutatbasei0_2_ on zutatbasei0_.id=zutatbasei0_2_.id left outer join ZutatStueckzahlInheritanceBean zutatbasei0_3_ on
zutatbasei0_.id=zutatbasei0_3_.id
kuchen.getZutaten
).instanceof
:
ZutatBaseInheritanceBean zutatSelected = (ZutatBaseInheritanceBean) this.jListZutaten.getModel().getElementAt(this.jListZutaten.getSelectedIndex());
if (zutatSelected instanceof ZutatStueckzahlInheritanceBean)
{
ZutatStueckzahlInheritanceBean zutatStueckzahl = (ZutatStueckzahlInheritanceBean) zutatSelected;
...
}
else if (zutatSelected instanceof ZutatFluessigkeitInheritanceBean)
{
ZutatFluessigkeitInheritanceBean zutatFluessigkeit = (ZutatFluessigkeitInheritanceBean) zutatSelected;
...
}
else if (zutatSelected instanceof ZutatGewichtInheritanceBean)
{
ZutatGewichtInheritanceBean zutatGewicht = (ZutatGewichtInheritanceBean) zutatSelected;
...
}
java.util.concurrent.CountDownLatch
gegangen.C:\Temp\wildfly-30.0.0.Final\bin\appclient.bat x:\PfadZurEarDatei\KuchenZutatInheritance.ear#KuchenZutatInheritanceClient.jar
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private static final java.lang.Object javax.swing.JFrame.defaultLookAndFeelDecoratedKey accessible:
module java.desktop does not \"opens javax.swing\" to unnamed module @f7cd57e"}
set JAVA_OPTS=--add-opens=java.desktop/javax.swing=ALL-UNNAMED --add-opens=java.desktop/java.awt=ALL-UNNAMED
%WILDFLY_HOME%\bin\appclient.bat c:\temp\KuchenSimple.ear#KuchenSimpleClient.jar
--illegal-access=permit
setzen, aber dies wurde in Java 17 entfernt.
Mit WildFly 30 kam es beim Hinzufügen des ersten Kuchens zur Fehlermeldung java.lang.ClassNotFoundException: org.hibernate.collection.spi.PersistentBag from [Module "deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceClient.jar"
from Service Module Loader]
im Client (https://issues.redhat.com/browse/WFLY-19020):
2024-02-07 19:24:38,650 ERROR [stderr] (AWT-EventQueue-0) jakarta.ejb.EJBException: Failed to read response
2024-02-07 19:24:38,651 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.ejb-client@5.0.5.Final//org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation$MethodCallResultProducer.apply(EJBClientChannel.java:1367)
...
2024-02-07 19:24:38,656 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.ejb-client@5.0.5.Final//org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:116)
2024-02-07 19:24:38,656 ERROR [stderr] (AWT-EventQueue-0) at deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceEJB.jar/jdk.proxy6/jdk.proxy6.$Proxy13.getKuchen(Unknown Source)
2024-02-07 19:24:38,656 ERROR [stderr] (AWT-EventQueue-0) at deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceClient.jar//de.hsrm.jakartaee.knauf.kuchenzutatinheritance.FrameKuchenZutatInheritance.fillKuchen(FrameKuchenZutatInheritance.java:483)
2024-02-07 19:24:38,656 ERROR [stderr] (AWT-EventQueue-0) at deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceClient.jar//de.hsrm.jakartaee.knauf.kuchenzutatinheritance.FrameKuchenZutatInheritance.jButtonKuchenNeuActionPerformed(FrameKuchenZutatInheritance.java:395)
2024-02-07 19:24:38,657 ERROR [stderr] (AWT-EventQueue-0) at deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceClient.jar//de.hsrm.jakartaee.knauf.kuchenzutatinheritance.FrameKuchenZutatInheritance$3.actionPerformed(FrameKuchenZutatInheritance.java:169)
2024-02-07 19:24:38,657 ERROR [stderr] (AWT-EventQueue-0) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
...
2024-02-07 19:24:38,662 ERROR [stderr] (AWT-EventQueue-0) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
2024-02-07 19:24:38,662 ERROR [stderr] (AWT-EventQueue-0) Caused by: java.lang.ClassNotFoundException: org.hibernate.collection.spi.PersistentBag from [Module "deployment.KuchenZutatInheritance.ear.KuchenZutatInheritanceClient.jar" from Service Module Loader]
2024-02-07 19:24:38,662 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:200)
2024-02-07 19:24:38,662 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410)
2024-02-07 19:24:38,662 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at java.base/java.lang.Class.forName0(Native Method)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at java.base/java.lang.Class.forName(Class.java:467)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling@2.1.3.SP1//org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:129)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling@2.1.3.SP1//org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:110)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:1227)
2024-02-07 19:24:38,663 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1560)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:441)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:388)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.readFields(RiverUnmarshaller.java:2107)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:2020)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1601)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:441)
2024-02-07 19:24:38,664 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:388)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadCollectionObject(RiverUnmarshaller.java:344)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.readCollectionData(RiverUnmarshaller.java:1055)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:908)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling.river@2.1.3.SP1//org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:373)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.marshalling@2.1.3.SP1//org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41)
2024-02-07 19:24:38,665 ERROR [stderr] (AWT-EventQueue-0) at org.jboss.ejb-client@5.0.5.Final//org.jboss.ejb.protocol.remote.EJBClientChannel$MethodInvocation$MethodCallResultProducer.apply(EJBClientChannel.java:1341)
2024-02-07 19:24:38,666 ERROR [stderr] (AWT-EventQueue-0) ... 67 more
Workaround: die vermisste Klasse steckt in "%WILDFLY_HOME%\modules\system\layers\base\org\hibernate\main\hibernate-core-6.2.13.Final.jar" und ist Teil des WildFly-Moduls "org.hibernate".
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:jboss:deployment-structure:1.3 http://www.jboss.org/schema/jbossas/jboss-deployment-structure-1_3.xsd">
<deployment>
<dependencies>
<module name="org.hibernate" export="true">
</module>
</dependencies>
</deployment>
</jboss-deployment-structure>
Fett markiert ist das Einbinden des Moduls "Hibernate".<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/ejb-jar_4_0.xsd"
version="4.0">
<display-name>KuchenZutatInheritanceEJB</display-name>
<enterprise-beans>
<session>
<description>
<![CDATA[Stateless Session Bean für das Arbeiten mit Kuchen und Zutaten.]]>
</description>
<display-name>KuchenZutatInheritanceWorkerBean</display-name>
<ejb-name>KuchenZutatInheritanceWorkerBean</ejb-name>
<business-remote>de.hsrm.jakartaee.knauf.kuchenzutatinheritance.KuchenZutatInheritanceWorkerRemote</business-remote>
<ejb-class>de.hsrm.jakartaee.knauf.kuchenzutatinheritance.KuchenZutatInheritanceWorkerBean</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>KuchenZutatInheritancePersistenceUnitRef</persistence-context-ref-name>
<persistence-unit-name>kuchenZutatInheritancePersistenceUnit</persistence-unit-name>
<injection-target>
<injection-target-class>
de.hsrm.jakartaee.knauf.kuchenzutatinheritance.KuchenZutatInheritanceWorkerBean
</injection-target-class>
<injection-target-name>entityManager</injection-target-name>
</injection-target>
</persistence-context-ref>
</session>
</enterprise-beans>
</ejb-jar>
Es gibt keine Neuerungen im Vergleich zum KuchenZutatNM-Beispiel. <?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="https://jakarta.ee/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence/orm https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd"
version="3.1">
<named-query name="findAllKuchen">
<query>select o from KuchenInheritanceBean o</query>
</named-query>
<named-query name="findAllZutaten">
<query>select o from ZutatBaseInheritanceBean o</query>
</named-query>
<named-query name="findAllZutatenFluessigkeit">
<query>select o from ZutatFluessigkeitInheritanceBean o</query>
</named-query>
<named-query name="findAllZutatenGewicht">
<query>select o from ZutatGewichtInheritanceBean o</query>
</named-query>
<named-query name="findAllZutatenStueckzahl">
<query>select o from ZutatStueckzahlInheritanceBean o</query>
</named-query>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatBaseInheritanceBean" access="PROPERTY"
metadata-complete="true">
<inheritance strategy="JOINED"/>
<attributes>
<id name="id">
<generated-value />
</id>
<basic name="zutatName"/>
<many-to-one name="kuchen"
target-entity="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.KuchenInheritanceBean">
</many-to-one>
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatFluessigkeitInheritanceBean" access="PROPERTY"
metadata-complete="true">
<attributes>
<basic name="masseinheitMenge"/>
<basic name="masseinheit">
<enumerated>STRING</enumerated>
</basic>
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatGewichtInheritanceBean" access="PROPERTY"
metadata-complete="true">
<attributes>
<basic name="gewichtEinheit">
<enumerated>STRING</enumerated>
</basic>
<basic name="gewicht"/>
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatStueckzahlInheritanceBean" access="PROPERTY"
metadata-complete="true">
<attributes>
<basic name="anzahl"/>
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.KuchenInheritanceBean" access="PROPERTY"
metadata-complete="true">
<attributes>
<id name="id">
<generated-value />
</id>
<basic name="name">
</basic>
<one-to-many name="zutaten" mapped-by="kuchen" fetch="EAGER"
target-entity="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatBaseInheritanceBean">
<cascade>
<cascade-all />
</cascade>
</one-to-many>
</attributes>
</entity>
</entity-mappings>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatBaseInheritanceBean" access="PROPERTY"
metadata-complete="true">
<inheritance strategy="SINGLE_TABLE"/>
<attributes>
...
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatFluessigkeitInheritanceBean" access="PROPERTY"
metadata-complete="true">
<discriminator-value>fluessigkeit</discriminator-value>
<attributes>
...
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatGewichtInheritanceBean" access="PROPERTY"
metadata-complete="true">
<discriminator-value>gewicht</discriminator-value>
<attributes>
...
</attributes>
</entity>
<entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatStueckzahlInheritanceBean" access="PROPERTY"
metadata-complete="true">
<discriminator-value>stueckzahl</discriminator-value>
<attributes>
...
</attributes>
</entity>
Auch hier ist bei Verwendung von "TABLE_PER_CLASS" die explizite Angabe
der strategy
nötig. <entity class="de.hsrm.jakartaee.knauf.kuchenzutatinheritance.ZutatBaseInheritanceBean" access="PROPERTY"
metadata-complete="true">
<inheritance strategy="TABLE_PER_CLASS"/>
<attributes>
...
</attributes>
</entity>