继承如何在实体中运作?我的意思是例如
public class Animal {
private String name;
//Getters and setters
}
@Entity
public class Dog extends Animal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
}
但是hibernate只在数据库中使用id创建表,为什么?
答案 0 :(得分:0)
你的基础classe没有用 .message:first-of-type {
background: purple;
}
注释,所以hibernate不知道它的存在。 ORM中的继承未在Java中实现为继承。您有特定的构造/注释来定义表继承。
答案 1 :(得分:0)
您应该使用@MappedSuperClass
标记您的超级课程:
@MappedSuperClass
public class Animal {
private String name;
//Getters and setters
}
答案 2 :(得分:0)
来自Java Platform, Enterprise Edition: The Java EE Tutorial
:
37.2.3非实体超类
实体可能有非实体超类,而这些超类可以 无论是抽象的还是具体的。非实体超类的状态 是非持久的, 以及从非实体继承的任何状态 实体类的超类是非持久的 。非实体 超级类可能不会在
EntityManager
或Query
操作中使用。的 任何 非实体超类中的映射或关系注释 忽略。 强>
所以你需要这样的东西:
@MappedSuperclass
public class Animal {
@Column
private String name;
//Getters and setters
}
同样来自abve提到的来源:
37.2.2映射超类
实体可以从包含持久状态和映射信息但不是实体的超类继承。 也就是说, 超类没有用
@Entity
注释修饰,也没有 由Java Persistence提供程序映射为实体。这些 当你有状态和映射时,最常使用超类 多个实体类共有的信息。通过使用。装饰类来指定映射的超类 注释
javax.persistence.MappedSuperclass