Dzień dobry, drodzy towarzysze,Single Table Inheritance BEZ dyskryminacyjne kolumny
To zaczyna być irytujące przyjść - prosta sprawa, ale godziny walki, ja starzeję ??
Próbuję odwzorować dwie klasy do jednej tabeli przy użyciu WZP przez Hibernate. Chodzi o to, aby mieć tylko niewielki podzbiór kolumn w klasie nadrzędnej i większy/pełny zestaw w klasie dziecka. Nie ma tu dziedziczenia NIE TABELA, tylko dziedziczenie klasy. Jak można tego dokonać?
Rozwiązanie to nie będzie działać:
@Entity
@Table(name = "the_table")
class Parent implements Serializable {
}
@Entity
@Table(name = "the_table")
class Child extends Parent implements Serializable {
}
Hibernate zakłada strategia domyślna dziedziczenie InheritanceType.SINGLE_TABLE i szuka kolumnie dyskryminatora - dtype domyślnie. Ale czekaj - nie ma dziedziczenia tabel, mając kolumnę dyskryminatora nie ma sensu.
Przyjrzałem się również PolymorphismType.EXPLICIT, które nie miało żadnego znaczenia. Ślad stosu jest:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'apprentice0_.DTYPE' in 'where clause'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2281)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881)
tak, jeszcze jedno:
@MappedSuperclass
i @Embeddable
są bezużyteczne jako takie nie mogą być używane w połączeniu z @Entity
- klasa dominująca musi być sama @Entity
ponieważ jest używany do utrzymywania się gdzie indziej.
Po prostu zgadnij ... Usunąć '@ Entity' i' @ Table' z klasy nadrzędnej? Nie chcesz przechowywać go osobno, prawda? – jbrookover