私はJBossでhibernate/JPAを数か月間使用してきましたが、答えや解決策が見つからない質問が1つあります。
新しいエンティティ 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() の呼び出しをスニペットの最後に移動すると、上記のエラーが発生します。
私が取り組んでいるオブジェクトが永続化されていないことは承知していますが、永続化するとエラーが発生した場合にロールバックできなくなります。
これには解決策があると思いますので、誰かが答えを持っていれば、とても感謝しています。私は何が欠けていますか?