2015-10-13 8 views
10

私は何かに興味がありました。我々は従業員電話間の簡単な関係を持っているとしましょう:リレーション内のテーブルが空の場合、Hibernateはnullまたは空のコレクションを返しますか?

@Entity 
public class Employee { 
    @Id 
    @Column(name="EMP_ID") 
    private long id; 
    ... 
    @OneToMany(mappedBy="owner") 
    private List<Phone> phones; 
    ... 
} 
@Entity 
public class Phone { 
    @Id 
    private long id; 
    ... 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="OWNER_ID") 
    private Employee owner; 
    ... 
} 

はのは社員は、電話テーブルにエントリを何も携帯電話を持っていないと仮定しましょう。 私は

for (Phone phone : employee.getPhones()) 
{ 
    ... 
} 

はゲッターretunのNULLまたは空のコレクションとはgetching戦略が役割を果たしてしまうだろうどのような理由のためにそれらの上に従業員の電話や繰り返し処理を取得するコードの部分を持っているとしたら。

私の記憶が正しければ、Hibernateはプロキシを使用して、コレクションの独自の実装を持っており、(私が間違っている場合は正しい)ためLAZYはそれがそれらのいずれかでインスタンス化し、必要なときにテーブルからデータを取得し、取得します。 getterが呼び出されたときに、テーブルからデータを取得しようとすると、空のセットが結果として得られ、空のコレクションが返されます。 (これが私の考えです)。または、ゲッターの結果がNULLであるかどうかを常に確認する必要がありますか?

+2

おそらく空リストです。空リストの代わりに 'null'を返すことは悪い習慣です。 – Tunaki

+0

あなたはいつでもゲッターをチェックインし、電話が空であれば空のリストを返すことができます – arados

+0

ええ、私は最終的には残念ながら私はラップトップにアクセスできず、しばらくしていません。いくつかの友達といくつかのことを話し合っていて、私たちは知る必要がありました。私はそれが怠け者だと知っていますが、私はそれを今すぐ確認することができればわかります...申し訳ありません –

答えて

3

これらのコレクションはデフォルトでは怠惰なので、リストにアクセスするときにリスト要素を読み込む、そのコレクションのプロキシを返します(PersistentListなど)。それは空であるかもしれないが - Phoneは関係の所有者であるため、

また、Hibernateは、それはリストが存在すると仮定しているので、そこに任意の電話が従業員のためのものであるかどうかを知ることができません。 HibernateはコレクションgetPhones()必見の遅延ロードを実装するためにどれ

  • がないことを確認するために最初に電話をしようとしてロードする必要があります

    • :ので、それは、Hibernateはnullを返すようにするために、それはあまり意味がないと述べましたヌルが、プロキシを返さないリストがnullだった場合は、携帯電話を追加すると、自動的になど、カスケードHibernateは使用してみましょうことができませんでした
    • (リストはまだ、それだけで空の存在することになる)とにかく悪い習慣になり、ヌルを返し
    • その変更を維持してください(Gimbyがそれを指摘してくれたため)

    Hibernateは、空のリストが表現するときに従業員がnullを返す電話がないことを知っているにもかかわらず、まだほとんど意味がないと考えています(ロードされた従業員、eager fetchingなどのためにnullが使用されていた場合は必要のないコードの違いなど)。

  • 関連する問題