2

こんにちは、ManyToOne 関係を作成しようとしましたが、行き詰まりました。

請求書と予約クラスがあります

現実は次のとおりです。請求書には多くの予約を含めることができます。(1:m) Bill クラスは、1 つの Bill にのみ属する Booking の関係を管理する必要があります。(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からでもサイドからでも、単一の を削除することはできません。BillBooking

何が恋しいですか?

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は、請求書から予約を削除するたびに(つまり、その予約が孤立したときに)データベースから削除されることを保証します。請求書を削除すると、そのすべてのBookingSも(CascadeType.ALLアノテーションを介して)削除されます。

上記の宣言により、次の方法で予約を設定できます。

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 に答える