В моем проекте, похожем на сервис 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?Должен ли я использовать это каким-то образом?Или я просто неправильно использую метод удаления?