2

嗨,我尝试创建一个 ManyToOne 关系但被卡住了。

我有一个 BILL 和一个 Booking Class

实际情况是:一个账单可以有很多预订。(1:m) Bill Class 应该管理关系 A Booking 只属于一个 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已删除。但我不能BookingBill侧面或Booking侧面删除单个 。

我想念什么?

4

1 回答 1

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 中删除一个 Booking(即,当该 Booking 成为孤立的时),它将从数据库中删除。如果您删除 Bill,那么它的所有 BookingS 也会被删除(通过 CascadeType.ALL 注释)。

通过上述声明,您可以通过以下方式设置 Bookings

for(Booking booking : bookings) {
    bill.bookings.add(booking);
    booking.bill = bill;
}

(您不需要自己编写 setBookings() 代码)但您必须确保双方都进行了更改。

对于删除,如果您将预订的账单设置为 null 并从账单的预订中删除该预订:

booking.bill = null;
bill.bookings.remove(booking);

应该这样做。

如果你打电话

booking.delete();

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

真的很标准……

于 2011-07-10T22:48:39.143 回答