没有级联的父子关系

时间:2015-11-20 02:33:30

标签: java jpa orm

在父 - 子关系中不使用级联是否有用? 实际上我总是使用级联,我想知道这是否有趣,以避免使用它们。

@Entity
public class Lodger{
    @OneToMany
    private List<Bail> bailList;
    ...
}

@Entity
public class Bail {
     @OneToMany
    private List<Rent> rents;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "lodger_id")
    private Lodger lodger;

    @OneToOne
    private Room room;
}

@Entity
private class Rent{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "bail_id")
    private Bail bail;

    @OneToMany
    private List<RoomPayment> roomPayment;
}

@Entity
private class RoomPayment{
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "rent_id")
    private Rent rent;
}

所以所有关系似乎都是构图。如果我创建一个新的RoomPayment,那么做得更好:

roomPayment.setRent(rent);
roomPaymentDao.save(roomPayment);


rent.getRoomPayment().add(roomPayment);
rentDao.save(rent);

1 个答案:

答案 0 :(得分:0)

我认为你正在混淆作品父子关系

<强>组合物

来自wikipedia definition

  

它被称为复合,如果它所引用的对象实际上是它的部分,即没有独立存在

复合关系始终使用CascadeType.ALL[CascadeType.PERSIST, CascadeType.REMOVE]建模(对于您希望仅在必要时更新的大型对象,后者)。如果您在这里不使用级联,则表示没有合成。

亲子关系

可以将不同的关系称为父 - 子关系。我猜你在谈论像目录关联这样的东西:

@Entity
public Directory {
  @ManyToOne
  private Directory parent;

  @OneToMany(mappedBy = "parent")
  private Collection<Directory> children;
}

在这种情况下,您通常需要手动管理关联,因为如果更改根目录的属性,则不希望更新整个树。

您可以将CascadeType.REMOVE添加到children关联中 - 但最好明确删除子目录以防止出现有害错误(例如-r的显式rm)。< / p>