数据建模——创建一个双向的多对一关系



嗨,我尝试创建一个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();

那么它的预订也应该被删除。

非常标准....

最新更新