java - Hibernate继承,多态保存

标签 java sql hibernate inheritance

我有一个类Person有两个子类 StudentEmployee

@Entity(name="person")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
    @Id
    @GeneratedValue
    private Integer id;
}

@Entity(name="student")
@PrimaryKeyJoinColumn(name="id")
public class Student extends Pessoa implements Serializable {
}

@Entity(name="employee")
@PrimaryKeyJoinColumn(name="id")
public class Employee extends Person implements Serializable {
}

学生也可以是雇员,但是当我尝试保存与雇员具有相同 id 的学生时,hibernate 会抛出重复的主键异常
org.hibernate.exception.ConstraintViolationException: Duplicate entry '142.855.267-71' for key 'PRIMARY'

hibernate 试图在数据库中插入一个新人,我不希望那样。

有没有办法让hibernate识别数据库中已经存在一个人并只保存对这个人的引用?

顺便说一句:当我手动插入一个学生和一个员工时,一切都像魅力一样。

最佳答案

您需要指定表和列映射。以下是每个子类映射的表。

@Entity(name="person")
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "ID")
    private Integer id;
}

@Entity(name="student")
@Table(name="STUDENT")
@PrimaryKeyJoinColumn(name="id")
public class Student extends Pessoa implements Serializable {
}

@Entity(name="employee")
@Table(name="EMPLOYEE")
@PrimaryKeyJoinColumn(name="id")
public class Employee extends Person implements Serializable {
}

关于java - Hibernate继承,多态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19881658/

相关文章:

sql - T-SQL - 根据周数获取开始和结束日期。

java - Hibernate 逆向工程使用 CustomReverseEngineeringStrategy 类删除目录名称

java - 蜂窝一键通 (PoC) 客户端和服务器

java - @XmlElement - 从未使用 @xml-annotation 映射的对象获取字符串值

sql - 合并两个表而不破坏原始列的内容

java - 如何测试LazyInitializationException?

postgresql - 推迟物化 View 的创建

java - 无法使用 iText 显示 unicode 0x0332

java - 为 Robolectric 的 SharedPreferences 提供测试数据

mysql - 这些表是第二范式吗?第三?