私は数ヶ月のために一緒にHibernate / JPAでのJBossに取り組んできましたが、私は答えや解決策を見つけることができない一つの質問があります。
:それはあなたが新しいエンティティBeanを作成するときに、クエリを実行する前に、私は少なくともコールEntityManager.persist(EntityBeanのは)そうすることはできません、次のエラーが発生したようです
TransientObjectException:一時オブジェクトの参照、保存されていないのインスタンス - リフレッシュする前に一時的なインスタンスを保存
例:
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);
私の質問あなたが初めてではない埋蔵「ジョブ」(コメントアウト行)を行う場合、あなたは。ActionPlanと仕事が関連しているcreateNamedQueryを呼び出すことはできませんが、NamedQuery(findByCommand)仕事をカップリング上ではありません。気になる私は、新しく作成されたときということです私は仕事のクエリにデータベースを維持する必要があるので、この場合で仕事をしても、意味がありません。
持続()の呼び出しは、上記のエラーが発生しますコードセグメントの末尾に移動されます。
私は、オブジェクトに取り組んでいることは永続的ではないですけど、もしエラーがロールバックすることができないことを永続的なので。
私は誰かが答えを得た場合ので、私は非常に感謝される、解決策があると信じている。私は何をしないのですか?
ベストの答え
右、データベースの内容が合理的ではありません問い合わせるように見えることはできませんか?あなたは行うことができますトランザクションを使用して起動することです。単純なケースでは、あなたのセッションは、セッションを閉じるまで開いたままになりますトランザクションを持っています。することにより、トランザクションが提出され、すべての変更内容が保存されます。ユーエラーが発生したときに実行する必要性は、トランザクションのロールバックです。
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();
}