创建双向ManyToOne关系

时间:2011-07-10 16:45:19

标签: data-modeling playframework cascade many-to-one

您好我尝试创建一个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

我想念什么?

1 个答案:

答案 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();

然后它的预订也应该删除。

非常标准....