0

私は JPA の多対一の関係と混同しています。多くの「判断」を持つクラス「判断」があります。判断インスタンスを postgres db に保存しようとすると、次のようなエラー メッセージが表示されました。

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.dyihi.evaluation.model.Judgement.judge -> com.dyihi.evaluation.model.User

判定クラス:

@Entity
@Table(name = "JUDGEMENTS")
public class Judgement implements Serializable, Cloneable {

    /**
     * 
     */
    private static final long serialVersionUID = -7049957706738879274L;

    @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.DETACH})
    @JoinColumn(name = "user_id")
    private User judge;

そして私のサービスクラス:

public Long store(Judgement judgement) throws RepositoryException {

        EntityManager em = null;
        EntityTransaction tx = null;
        try {
            em = _emf.createEntityManager();
            tx = em.getTransaction();
            tx.begin();
            em.persist(judgement);
            tx.commit();
            return judgement.getId();
        }
        finally {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
            if (em != null) {
                em.close();
                em = null;
            }
        }
    }

そして、私のデータベースには、Judgment と User というテーブルがあります。ManyToOne 関係のために、Judgement_User としてテーブルを作成する必要がありますか?

4

1 に答える 1

0

第一に、あなたが述べたように、あなたが多くの裁判官を持つための判断を探しているなら、あなたは物事を逆行させます。ケムが彼のコメントで示唆しているように、あなたが今それをコード化した方法多くの判決は1人の裁判官を持っています、逆は1人の裁判官が多くの判決を持っているかもしれないということです。

あなたの質問に答えて、あなたが保存しようとしている判断に関連する裁判官自体は保存されていません。カスケード定義では、パーシストをジャッジにカスケードすることはできません。したがって、JPAは例外をスローする以外に選択肢はありません。カスケード定義を変更するか、手動でジャッジを保存することができます。ジャッジが永続的であるが切り離されている場合は、最初にジャッジをマージして、エンティティマネージャーに再アタッチする必要があります。

于 2012-05-17T21:01:22.323 に答える