在我的项目中,类似于某种Amazon Prime服务,用户(Id
,名字和姓氏)可以租借(UserId
和MovieId
)电影({{ 1}},标题,导演和长度)。
该项目具有以下结构:
Id
实体都具有以下代码的变体(RentalsID除外,它只有两个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
“出租”除外,其中也有@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)
。
XXXFacades从AbstractFacade扩展而来,它们仅具有EntityManager,以及一些用于保存,更新和删除实体的方法。他们在这里:
@Id
WebXXX可以与xhtml控制器进行通信。
我的问题是关于租赁。由于它们具有两个主要的外键,因此在其外观中发生了某些事情,实际上并没有起作用。
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());
}
}
当我尝试通过发送空对象时,它打印了FINDME并引发了异常。但是,当我通过一个Rental对象发送时,它没有打印任何内容,甚至没有异常。我真的不知道它是否进入,因为它没有抛出错误,应该进入,但是由于它没有打印我的FINDME标志,所以我什至不认为它正在进入方法。
我该如何解决?它与RentalId对象有关吗?我必须以某种方式使用它吗?还是我只是错误地使用了remove方法?