【问题标题】:Hibernate ternary relationship and additional tableHibernate三元关系和附加表
【发布时间】:2017-10-11 10:58:02
【问题描述】:

我有 3 个实体可以彼此建立关系。所以解决这个问题的一个好步骤是使用另一个表来存储 3 个实体的 3 个 ID。 假设实体是 X、Y 和 Z。

@Entity
public class XYZ {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "X_ID")
    private X x;

    @ManyToOne
    @JoinColumn(name = "Y_ID")
    private Y y ;

    @ManyToOne
    @JoinColumn(name = "Z_ID")
    private Z z;

    public XYZ(){

    }


}

实体 X、Y 和 Z 有自己的属性和自己的主键。 我有几个问题。

1) 我是否应该在私有 XYZ xyz 属性上的 X、Y 和 Z 实体中添加 @OneToMany; ?或者当我们只想借助 XYZ 表查找关系时,是不是没有必要。

2) 在实体 XZY 中,我为实体 X、Y 和 Z 提供了普通的 getter 和 setter。我给出了整个实体。 Hibernate 会自动获取 XYZ 实体中 X、Y 和 Z 的主键吗?

最后一个问题 3) 假设我删除了 XYZ 实体中正在使用的对象 X,休眠会自动删除 XYZ 实体中的记录吗?还是我必须添加其他信息。

很抱歉这些问题,但 Hibernate 对我来说是非常新的。

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:
    1. 在另一边(在 X、Y 和 Z 实体上)指定 @OneToMany 是 没有必要,除非你想建立你的关系 双向。
    2. 您已经定义了@JoinColumn 注释: X_ID、Y_ID、Z_ID 是取自 X、Y 和 Z 实体的主键。
    3. 如果您想执行级联删除,这样当您删除 X 时,子实体 XYZ 也会被删除,那么此时您需要建立双向关系。您需要在 X 实体上指定 @OneToMany 映射并添加级联属性。

    例子:

    @OneToMany(mappedBy="x", cascade=CascadeType.REMOVE)
    Set<XYZ> xyzSet;
    

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 2011-07-07
      • 2017-01-08
      • 1970-01-01
      • 2013-07-06
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多