java - Single Table Inheritance WITHOUT Discriminator 列

标签 java hibernate jpa

早安,我亲爱的同志们,

这开始变得烦人了 - 一件简单的事情,但经过数小时的努力,我会变老吗??

我正在尝试使用 Hibernate 的 JPA 将两个类映射到一个表。这个想法是在父类中只有一小部分列,在子类中设置更大/完整。不涉及 TABLE 继承,仅涉及类继承。 这个怎么实现??

这样做是行不通的:

@Entity
@Table(name = "the_table")
class Parent implements Serializable {
}

@Entity
@Table(name = "the_table")
class Child extends Parent implements Serializable {
}

Hibernate 假定默认继承策略 InheritanceType.SINGLE_TABLE,并且默认情况下正在寻找鉴别器列 - DTYPE。但是等等 - 没有表继承,有鉴别器列没有意义。

我还查看了 PolymorphismType.EXPLICIT,它没有任何区别。堆栈跟踪是:

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)

是的,还有一件事:

@MappedSuperclass@Embeddable 没有用,因为它们不能与 @Entity 一起使用 - 父类有成为 @Entity 本身,因为它被用于其他地方的持久性。

最佳答案

@MappedSuperclass 是必须使用的注解。如果同一个类既是映射的父类(super class)又是实体,则只需将其拆分为两个类:

@MappedSuperclass
public class Parent {
    // ...
}

@Entity
public class ParentEntity extends Parent {
    // no code at all here
}

@Entity
public class Child extends Parent {
    // additional fields and methods here
}

关于java - Single Table Inheritance WITHOUT Discriminator 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6572814/

相关文章:

java - 将空列表作为参数传递给 JPA 查询会引发错误

java - 如何获取本地化的日期模式字符串?

java - 横向模式在 Android Studio 模拟器中不起作用?

java - 分离对象中的 Hibernate 延迟加载

java - 无法使 jpa 与 glassfish 和 mysql 一起工作

hibernate - Spring Boot JPA 将架构名称外部化到属性文件

java - 当尝试在 SOP 语句中使用我创建的类中的方法时,如何使用它们?

java - 从Java中的国家代码获取默认语言

hibernate - 无法使用 Spring-Boot 创建多个数据源

mysql - HikariCP 未释放事件的 MySql 连接