gpt4 book ai didi

java - 坚持使用 hibernate/JPA

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:07 26 4
gpt4 key购买 nike

我在 JBoss 上使用 hibernate/JPA 已经有几个月了,有一个问题我找不到答案或解决方案。

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

TransientObjectException:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例

一个例子:

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。令我困扰的是,当新创建的作业在这种情况下甚至没有意义时,我需要保留作业以查询数据库。
将对 persist() 的调用移动到代码段的末尾会产生上述错误。

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

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

最佳答案

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

附言Here at the bottom你可以找到“一个典型的交易应该使用以下习惯用法”。

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();
}

关于java - 坚持使用 hibernate/JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/283454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com