嗨,我尝试创建一个ManyToOne关系,但被卡住了。
我有一个BILL和一个Booking Class
关系如下:一张账单可以有多个预订。(1: m)Bill类应该管理这个关系一个预订只属于一个帐单。(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
侧。
我错过了什么?
您的案例是标准的父子案例。你需要声明以下内容:
@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;
}
这段代码包含所有必要的声明。孤儿院移除确保无论何时从账单中删除一个预订(即,当该预订成为孤儿时),它都将从数据库中删除。如果您删除了账单,那么它的所有预订也将被删除(通过cascade类型)。所有注释)。
使用上述声明,您可以通过
设置预订for(Booking booking : bookings) {
bill.bookings.add(booking);
booking.bill = bill;
}
(你不需要自己编写set订票()),但你必须确保你在两边都做了修改。
对于删除,如果您将预订的账单设置为null并从该账单的预订中删除该预订:
booking.bill = null;
bill.bookings.remove(booking);
应该做。
如果你调用
booking.delete();
那么它的预订也应该被删除。
非常标准....