1
    Collar collar = cat.getCollar();
    if(collar==null) {
        collar = new Collar(cat);
    }

    collar.setStuds(true);

    catDAO.mergeState(cat);

これは、カラーが一時的なオブジェクトであり、トランザクションをフラッシュする前に保存する必要があることを訴えています。

これを修正するには、次のようにします。

    if(collar==null) {
        collar = new Collar(cat);
        catDao.makePersistent();
    }

これは正しいです?Hibernate が私の新しいエンティティの永続化を処理するべきではありませんか?

編集:詳細を追加しました。Spring MVC バージョン 3.0.5 と Hibernate 3 を使用しています。

    class Cat {
        ...
        @OneToOne(mappedBy="cat")
        public Collar getCollar() {
            return collar;
        }
        // etc
    }

    class Collar {
        @OneToOne(optional = false, cascade = { CascadeType.PERSIST,
            CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.LAZY)
        @JoinColumn(name="CAT_ID", nullable = false)
        public Cat getCat() {
            return cat;
        }
        // etc
    }

私のDAO呼び出しのmergeState()メソッドentityManager.merge(cat)(およびentityManager.flush()要求された場合)。

4

2 に答える 2

0

No, it shouldn't, unless your mergeState() method calls merge() and the association between Cat and Collar has a cascade = MERGE (or ALL) attribute.

于 2013-03-02T14:41:12.663 に答える
0

実際には、行 catDAO.mergeState(cat); で Cat エンティティを永続化しようとしています。

そして、Cat エンティティで Cat と Collar の間の関係 (例: @OneToMany など) を定義している場合....次に、cat を永続化すると、子エンティティの襟も保存されます。

はい、カスケード (ALL など) も構成する必要があります。

于 2013-03-02T14:45:47.980 に答える