1

更新:私は反対のことをすることで問題を「解決」することになりました!これで、エンティティ参照フィールドが読み取り専用(insertable = false updatable = false)に設定され、外部キーフィールドが読み取り/書き込みに設定されました。これは、新しいエンティティを保存するときに特別な注意を払う必要があることを意味しますが、クエリを実行すると、エンティティのプロパティが解決されます。


ドメインモデルに双方向の1対多の関連付けがあり、永続性プロバイダーとしてJPAアノテーションとHibernateを使用しています。これはほとんどあなたの標準的な親/子構成ですが、1つの違いは、親の外部キーを、次のように、親インスタンスへの参照と一緒に子の個別のプロパティとして公開することです。

@Entity
public class Child {
    @Id @GeneratedValue
    Long id;

    @Column(name="parent_id", insertable=false, updatable=false)
    private Long parentId;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="parent_id")
    private Parent parent;

    private long timestamp;
}

@Entity
public class Parent {
    @Id @GeneratedValue
    Long id;

    @OrderBy("timestamp")
    @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<Child> children;
}

これはほとんどの場合問題なく機能しますが、最初に偽の親を作成せずに、parent_id列に無効な値を入れたい場合が多くあります(レガシー)。

残念ながら、Hibernateは、がparentId原因でフィールドに割り当てられた値を保存しませんinsertable=false, updatable=false。これは、同じ列が複数のプロパティにマップされている場合に必要です。JDBCにドロップダウンしたり、インターセプターを実装したりせずに、「Hibernateの後ろに隠れて」そのフィールドに値を忍び込ませる良い方法はありますか?

ありがとう!

4

2 に答える 2

1

偽の親の何が問題なのですか? 一箇所でそれを行うためのきちんとした方法があります:

public void setParent(Parent parent) {
    this.parent = parent;
    this.parentId = parent == null ? null : parent.getId();
}

public void setParentId(Long parentId) {
    final Parent parent;
    if (parentId == null) {
        parent = null;
    } else {
        parent = new Parent();
        parent.setId(parentId);
    }
    setParent(parent);
}
于 2010-02-27T16:54:46.563 に答える
0

プロパティ値を挿入不可/更新可能にする代わりに、子のinverse = trueにManyToOneを設定することを検討しましたか?reverse = trueが以前と同じように動作する場合、子エンティティは関係の「信頼できる情報源ではない」ようになります。それでも列は読み取られますが、書き込まれません。私がこのような状況になってからしばらく経ちました。

于 2010-02-27T04:10:11.643 に答える