【问题标题】:Inheritance between entities within one table一个表内实体之间的继承
【发布时间】:2016-11-03 15:15:14
【问题描述】:

我知道问题可能很简单,但是,无论如何,我想在一张表中使用 hibernate 实现简单的父子关系:

Parent
|       \
Child1  Child2
|           |
Junior1    Junior2

所以它在数据库中应该如下所示:

id |  name | parent_id
1    Parent   null
2    Child1    1
3    Child2    1
4    Junior1   2
5    Junior2   3 

如果是@Entity 类:

@Entity
@Table(name = "PARENT_CHILD")
public class ParentChild {

    @Id
    @Column(name = "ID", nullable = false, unique = true)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    private String parentId; // <------ how this should be mapped?
}

关于我应该如何映射 parentId 或以另一种方式进行以下操作的最佳做​​法是什么?谢谢

【问题讨论】:

    标签: java hibernate jpa orm persistence


    【解决方案1】:

    通常,您可以创建关系映射以在 StateEntity 中进行映射

    @ManyToOne
    @JoinColumn(name="parent_id", referencedColumnName="id")
    private ParentChild parent;
    

    如果它是父级,则其父级可以为空。

    如果在您的项目中,由于性能原因,您可能只想加载 parent_id 而不是整个 ParchentChild 父实例。您也可以添加列映射

    @Column(name="parent_id", insertable=false, updatable=false)
    private int parentId;
    

    insertable=false, updatable=false 也确保您的系统只能通过 @ManyToOne 字段更新 parent_id

    【讨论】:

    • 嗨,乐透!谢谢你的回答!我确定我不会直接需要父 id,因为我不会得到 parentId,而是得到 ParentChild 对象。所以,我想,我需要完全私有的 ParentChild 父母;领域,对吧?
    • 是的。那么只需要@ManyToOne 映射。
    • 当我的 dao 尝试创建它时,它收到异常: 原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败( test_db.PARENT_CHILD,约束FK_5ghn6rityqie7cnwp5i5tf2ou外键(PARENT_ID)参考PARENT_CHILDID))可能是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多