EntityManager не удаляет составной объект - PullRequest
0 голосов
/ 10 июля 2019

В моем проекте, похожем на сервис Amazon Prime, пользователь (Id, имя и фамилия) может арендовать (UserId и MovieId) фильм (Id, должность, режиссер и т. Д.).длина).

Проект имеет следующую структуру:

Source Packages/
├── Entity/
│   ├── Movies.java
│   ├── Rentals.java
│   ├── RentalsId.java
│   └── Users.java
├── Session/
│   ├── AbstractFacade.java
│   ├── MoviesFacade.java
│   ├── RentalsFacade.java
│   └── UsersFacade.java
└── View/
    ├── WebMovie.java
    ├── WebRental.java
    └── WebUser.java

Где у всех сущностей есть варианты следующего кода (за исключением RentalsID, который имеет только две строки идентификаторов и это все):

@Entity
@Table(name = "xxx")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "xxx.findAll", query = "SELECT x FROM XXX x")
    , ....})
public class xxx implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Basic(optional = false)
    @Column(name = "id", length = 10, nullable = false)
    private String id;

    //getters, setters, other column data, equals, hash and tostring.

За исключением проката, который также имеет @IdClass(RentalsId.class) и два @Id.

XXXFacades расширяются от AbstractFacade, и у них есть только EntityManager, а также некоторые методысохранить, обновить и удалить объект.Вот они:

public void Save(x x, y y, z z) {
    try {
        xxx toSave = new xxx(x,y,z);
        entManager.persist(toSave);
    } catch (Exception e) {
        throw new EJBException(e.getMessage());
    }
}

public xxx Edit(xxx toChange) {
    try {
        return entManager.merge(toChange);
    } catch (Exception e) {
        throw new EJBException(e.getMessage());
    }
}

public void Delete(xxx toDelete) {
    try {   
        if (!entManager.contains(toDelete)) {
            toDelete = entManager.merge(toDelete);
        }

        entManager.remove(toDelete);
    } catch (Exception e) {
        throw new EJBException(e.getMessage());
    }
}

WebXXX для связи с контроллером xhtml.

Моя проблема связана с прокатом.Поскольку у них есть два первичных внешних ключа, на его фасаде происходит что-то, что на самом деле не работает.

public void Delete(Rentals delRental) {
    System.out.println("FINDME");
    try {
        RentalsId id = new RentalsId(delRental.getIduser(), delRental.getIdmovie());
        Rentals emp = em.find(Rentals.class, id);
        System.out.println("name = " + emp.getIduser()+ " " + "movie = " + emp.getIdmovie());

        if (!em.contains(delRental)) {
            delRental = em.merge(delRental);
        }
        em.remove(delRental);
    } catch (Exception e) {
        throw new EJBException(e.getMessage());
    }
}

Когда я попытался отправить через нулевой объект, он напечатал FINDME и выдал исключение.Но когда я отправлял через объект Rental, он ничего не печатал, даже не исключение.Я на самом деле не знаю о его вводе или нет, потому что, поскольку он не генерирует ошибки, он должен быть в нем, но поскольку он не печатает мой флаг FINDME, я не думаю, что он даже вводит метод.

Как я могу решитьэтот?Это как-то связано с объектом RentalId?Должен ли я использовать это каким-то образом?Или я просто неправильно использую метод удаления?

...