您好我尝试创建一个ManyToOne关系但是被卡住了。
我有一个BILL和一个预订舱
相关内容是: 比尔可以有很多预订。 (1:M) 账单类应该管理这种关系 预订仅属于一项法案。 (1:1没有账单就不能存在预订)
如果我删除该条例草案,则应删除属于该条例草案的所有预订。 如果我从账单中删除预订,则只应删除此预订。 如果我删除预订,则应从条例草案中删除此预订。
到目前为止,我有这个模型:
比尔等级
@Entity
public class Bill extends Model{
@OneToMany(cascade={CascadeType.ALL})
public List<Booking> bookings;
public void setBookings(List<Booking> bookings)
{
for (Booking booking : bookings)
{
booking.bill = this;
}
}
}
预订舱
@Entity
public class Booking extends Model{
@ManyToOne(optional=false )
@Required(message="Bill needed")
public Bill bill;
public void setBill(Bill bill){
this.bill=bill;
bill.bookings.add(this);
}
}
如果我删除Bill
,则所有预订也属于已删除的Bill
。
但我无法从Booking
方面或Bill
方删除单个Booking
。
我想念什么?
答案 0 :(得分:2)
您的案例是标准的父母案例。您需要声明以下内容:
@Entity
public class Bill extends Model {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy="bill")
public List<Booking> bookings = new ArrayList<Booking>();
}
@Entity
public class Booking extends Model {
@ManyToOne public Bill bill;
}
此代码包含所有必要的声明。 orphanRemoval确保每当您从Bill中删除预订时(即,当预订变为孤立时),它将从数据库中删除。如果您删除了Bill,那么它的所有BookingS也会被删除(通过CascadeType.ALL注释)。
通过上述声明,您可以设置预订
for(Booking booking : bookings) {
bill.bookings.add(booking);
booking.bill = bill;
}
(您不需要自己编写setBookings()),但必须确保双方都进行了更改。
如需删除,如果您将预订账单设为空并从账单预订中删除预订:
booking.bill = null;
bill.bookings.remove(booking);
应该这样做。
如果你打电话
booking.delete();
然后它的预订也应该删除。
非常标准....