【发布时间】:2014-06-28 01:17:01
【问题描述】:
我开始在带有 Glassfish 服务器 + Derby 数据库的 Netbeans 中使用 JPA,我对它的行为有些怀疑。我做了以下实验:我用属性定义了一个实体“用户”
@OneToMany(cascade=ALL, mappedBy="user")
public List<Thing> getThings() {
return things;
}
以及具有属性的实体“事物”
@ManyToOne
public Cook4User getUser() {
return user;
}
然后我保留了一个用户并向其添加了一个“事物”。一切都好,我可以看到两个表“用户”和“事物”,每个表都有一个条目,第二个表有一个表示用户 ID 的外键。 然后我从“Thing”表中删除了元素,运行了一个 select 语句来恢复用户,在其上调用 getThings() 方法,然后……我仍然找到了从 Thing 表中删除的元素!这怎么可能?它存储在哪里?我在数据库中看不到它!感谢您为我解决问题。
编辑:我试图隔离产生问题的代码行。
@PersistenceContext
private EntityManager em;
User user = new User();
em.persist(user);
Thing thing = new Thing();
em.persist(thing);
user.getThings().add(thing);
em.remove(thing);
user = em.find(User.class, userid);
logger.log(Level.INFO, "user still contains {0} things", user.getThings().size());
\\thing is still there!
【问题讨论】:
-
当你说'然后我从“事物”表中删除了元素'时,你是否使用类似
delete from Thing...的 SQL 查询从实际数据库中删除了记录或通过 JPA? -
我用 JPA 做到了。像往常一样,我从 EJB 中的 PersistenceContext 调用 EntityManager,在 Thing 表中查找元素,然后使用 remove() 方法将其删除。然后我通过 Netbeans 中的 select 语句检查了 DB,Thing 表实际上是空的。
-
没有代码很难帮助。您介意添加重现此问题的相关代码的 sn-ps 吗?
-
我添加了一些代码,如果您需要更多代码,请告诉我。谢谢。