3

几个月来,我一直在 JBoss 上使用 hibernate/JPA,并且有一个问题我找不到答案或解决方案。

似乎在创建新实体 bean 时,我至少在调用 EntityManager.persist(entityBean) 之前无法进行查询,否则我会收到以下错误:

TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

一个例子:

Job job = new Job();
Collection<Task> tasks = job.getTasks();
//entityManager.persist(job);
ActionPlan actionPlan = (ActionPlan) entityManager.createNamedQuery("ActionPlan.findByCommand").
                setParameter("type", RunOperation.Install).getSingleResult();
Task task = Task.getTask(actionPlan);
task.setActionPlan(actionPlan);
tasks.add(task);
task.setJob(job);

我的问题是,如果不先坚持“工作”(被注释掉的行),我就无法调用 createNamedQuery。ActionPlan 与 Job 有关系,但 NamedQuery (findByCommand) 不加入 Job。困扰我的是,我需要持久化 Job 才能查询数据库,而新创建的 Job 在这种情况下甚至不感兴趣。
将对 persist() 的调用移动到代码段的末尾会产生上述错误。

我知道我正在处理的对象没有持久化,但是如果发生错误,持久化使得无法回滚。

我相信有一个解决方案,所以如果有人有答案,我将非常感激。我错过了什么?

4

4 回答 4

3

您无法查询尚未在数据库中的内容似乎是合乎逻辑的,不是吗?您可以做的是开始使用事务。在一个简单的情况下,您的会话将有一个事务将一直打开,直到您关闭会话。在那一刻,事务将被提交,您的所有更改都将被保留。您只需要在出现错误时回滚您的事务。

PS在底部您可以找到“典型交易应使用以下成语”。

Session sess = factory.openSession();
Transaction tx;
try {
tx = sess.beginTransaction();
    //do some work
    ...
    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}
于 2008-11-12T11:09:57.047 回答
0

好吧,我认为 Java EE 5Tutorial 中的答案和阅读一些内容给了我正确的答案。

与我的看法相反,persist() 不会刷新到数据库,它只会将实体 bean 移动到持久状态。欺骗我的是,我注意到在调用persist之后,实体实际上还是被持久化到了数据库中(也许错误消息中的“保存”这个词)。我认为这是因为刷新被称为结束我的事务,但如果我得到了正确的 themalkolm,我仍然可以回滚 - 由我自己或由服务器在异常时回滚。

所以我得出的结论是;每当创建一个新实体时,只要它与另一个已经持久化的实体无关,就应该调用persist。
然后交易被维护,服务器更喜欢你一点;)

留下她的是,我仍然不明白为什么我无法在所有内容都处于持久状态的情况下进行查询。

于 2008-11-13T08:17:46.003 回答
0

我知道我无法查询尚未持久化的内容 - 也不是这种情况。我想找到的是其他实体 bean。不仅是同一类型,而且是我拥有的任何类型的实体 bean。然后我得到 TransientObjectException。

我有没有提到我使用 JBoss?我相信使用 J2EE 和 JPA 服务器可以控制我的事务,而我最后想做的就是干扰它?!所以对我来说,除了使用 requiresNew 等。我不会搞乱事务——服务器会。

也许我应该移动休眠标签,因为实际上我正在使用 JPA - JBoss 使用休眠。因此,请在任何代码示例中与此相关。

于 2008-11-12T11:54:19.357 回答
0

即使您保留对象,您仍然可以回滚它。只有在 EntityManager 上调用 flush 后,才会同步到底层数据库。

于 2008-11-13T06:07:10.463 回答