0

私は再帰的な関連付けを持つテーブルを持っています:

コンテナーは、親 (Column container_id) に関連付けることができます。コンテナはコンテナを子として持つことができます。

@Entity
public class Container implements Serializable {

  @ManyToOne
  @JoinColumn(name = "container_id", nullable = true, referencedColumnName = "original_id")
  private Container containedIn;

  @Column(name = "original_id")
  private long originalId;

  @OneToMany(mappedBy = "containedIn")
  private List<Container> contains = new ArrayList<>();

... 

問題:

生成されたリクエストは次のとおりです。

  Hibernate: select * from ( 
  select *  
  from container con0_, container con1_ 
  where con0_.container_id=con1_.original_id 
  order by con1_.code ) where rownum <= ?

私は左外部結合を期待しています:

from container con0_ left outer join container con1_ 
      on con0_.container_id=con1_.original_id.

親を持たないコンテナー (ルート ボックス CON0000007) は、Hibernate によって左結合が生成されないため、取得されません。

ID | ORIGINAL_ID| コード | タイプ | CONTAINER_ID (親)

1 | 2 | CON000000002 | パッケージ | 12

2 | 4 | CON000000004 | パッケージ | 10

4 | 6 | CON000000006 | パッケージ | 11

5 | 8 | CON000000008 | パッケージ | 10

7 | 10 | CON0000002 | ボックス | 15

8 | 11 | CON0000003 | ボックス | 15

9 | 12 | CON0000004 | ボックス | 15

12 | 15 | CON0000007 | ルートボックス | ヌル

4

1 に答える 1

0

モデルは問題ないようです。クエリで子レベルをロードしていないようです。また、デフォルトでは遅延ロードがあるため、hibernate は子に対してクエリを実行しません。この場合、例についてはこちらをご覧くださいHibernate: best practice to pull all lazy collection

于 2016-03-30T07:30:03.777 に答える