Создать двунаправленное отношение ManyToOne - PullRequest
2 голосов
/ 10 июля 2011

Привет, я пытаюсь создать отношение ManyToOne, но застрял.

У меня есть БИЛЛ и класс бронирования

Реализация: Билл может иметь много бронирований. (1: м) Класс Билла должен управлять отношениями Бронирование принадлежат только одному Биллу. (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 Ответ

2 голосов
/ 11 июля 2011

Ваш случай - стандартный родительский дочерний случай.Вам необходимо объявить следующее:

@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 гарантирует, что всякий раз, когда вы удаляете бронирование из Билла (т. Е. Когда это бронирование становится осиротевшим), оно будет удаляться из базы данных.Если вы удалите Билл, то все его резервирования также будут удалены (с помощью аннотации CascadeType.ALL).

С помощью вышеуказанных объявлений вы можете установить Бронирование на

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

(выне нужно кодировать setBookings () самостоятельно), но вы должны убедиться, что вы вносите изменения с обеих сторон.

Для удаления, если вы установили для Налогового счета счет-фактуру равным нулю и удалили его из бронирований Билла.:

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

должен сделать это.

Если вы позвоните

booking.delete();

, то и его заказы должны быть удалены.

Действительно довольно стандартно....

...