2013-04-11 7 views
5

が必要になります。Hibernateは怠惰なプロキシをロードするが、私は唯一の私は、これらのエンティティを持ってPK

player1.getId(); 

...

@Entity 
public class Room { 

    @ManyToOne(optional=true,fetch=FetchType.LAZY) 
    private Player player1; 

    ... 

} 

@Entity 
public class Player { 

    @Id 
    @Column(updatable=false) 
    private long id; 

    public long getId() { 
     return id; 
    } 

    ... 

} 

Room内部のこの文...その全体が発生しますPlayerデータベースからフェッチされるエンティティ。しかし、私はそれが既に持っているはずのプライマリキー、idが必要です(そうでなければ、データをどのように取得できますか?)。

Playerプロキシのidにアクセスするにはどうしたらいいですか?

答えて

4

として偽でなければなりませんHibernateは現在SessionにもリンクされたオブジェクトのIDを維持する必要があります。そして、Sessionにはidを取得するべきgetIdentifier()メソッドがあります。ドキュメントはそれについて何も言っていませんが、通常はオブジェクトを初期化すべきではありません。

+0

ありがとう、これはうまくいきます。 –

1

ルームエンティティには、@Column private long playerIdというアトリビュートを設定できます。この属性を呼び出すと、トランザクション内でPlayerオブジェクト全体を呼び出す必要なく、IDを取得できます。

これはplayerIdがRoomエンティティテーブル(またはビューなど)にも格納されていた場合にのみ機能しますが、最初に参加できるようにする必要があると想定します。

編集:@Adam Dygaは、後述するように、これらが挿入可能と更新可能の両方

@Entity 
public class Room { 

    @ManyToOne(optional=true,fetch=FetchType.LAZY) 
    private Player player1; 
    @Column(name="id", insertable = false, updatable = false) 
    private long playerId 
    ... 

} 
+0

あなたがこのように行った場合、そのうちの1つに「insertable = false、updateable = false」とマークすることを忘れないでください。 –

+0

ありがとう、私の回答を更新します – david99world

0

もっと簡単な解決策が見つかりました。これは、getId()finalです。これにより、HibernateはプロキシのレイジーフェッチアクションでHibernateをオーバーライドしないようにします。したがって、問題を起こさずに、すでに知られているIDだけを返します。

関連する問題