2011-12-29 1 views
0

Hibernateを使用してデータベースからオブジェクトをロードする際に問題があります。Hibernateでmany-to-many関係を持つオブジェクトのいくつかのcolをロードする方法

"A"、 "B"、 "C"の3つのJavaクラスがあります。 AおよびBは、追加テーブル "a_join_b"によって、mamy-to-many関係として関連付けられます。 AおよびCは、多対1の関係として関連付けられます。

コードがあります:

@Entity 
@Table(name = "A") 
public class AclassEnt implements java.io.Serializable{ 
@Id 
    @TableGenerator(name = "inventory", 
     table = "hibernate_sequences", 
     pkColumnName = "sequence_name", 
     pkColumnValue = "Emp_Gen", 
     valueColumnName = "sequence_next_hi_value", 
     initialValue = 0, 
     allocationSize = 100) 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "A_ID", nullable = false) 
    private Integer aId; 

    @Column(name = "A_NUMBER", length = 20) 
    private String aNumber; 

    @Column(name = "A_NAME", length = 15) 
    private String aName; 

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
       fetch = FetchType.EAGER, 
       targetEntity=WorkersEnt.class) 
    @JoinColumn(name="C_ID") 
    private CclassEnt cclass; 

    @ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class) 
    @JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") }) 
    private Set<BclassEnt> BclassList=new HashSet<BclassEnt>(); 

    //getters and settrs 
} 



@Entity 
@Table(name = "B") 
public class MeasureTypeEnt implements java.io.Serializable{ 

@Id 
    @TableGenerator(name = "inventory", 
    table = "hibernate_sequences", 
    pkColumnName = "sequence_name", 
    pkColumnValue = "Emp_Gen", 
    valueColumnName = "sequence_next_hi_value", 
    initialValue = 0, 
    allocationSize = 100) 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "B_ID", nullable = false) 
    private Integer bId; 

    @Basic(optional = false) 
    @Column(name = "B_NAME", nullable = false, length = 100) 
    private String bName; 

    //getters and setters 
} 

質問:どのように私はhextフィールドを持つオブジェクト "AclassEnt" を読み込むことができます:援助、もしaName、cclassとBclassList ???

次のコードを使用すると、すべてのcolをロードできます。最後に実行する必要があります。私は "BclassList"を意味します。

Criteria crit = session.createCriteria(AclassEnt.class,"c"); 
crit.createAlias("cclass", "cclass") 
    .createAlias("BclassList", "BclassList")//<-- is it correctly? 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("c.aId").as("aId")) 
    .add(Projections.property("c.aName").as("aName")) 
    .add(Projections.property("c.cclass").as("cclass")) 
    .add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly? 
    ); 

AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer(AclassEnt.class)).list(); 
+0

これはできません。条件クエリは、スカラーまたはエンティティのいずれかを返しますが、両方の組み合わせは返しません。しかし、あなたのクエリは、aNumberを除いてAとBとCを含むすべてのものをロードするようです。なぜあなたは絶対に列が読み込まれないようにしたいのですか? –

+0

JB Nizet、それは単なる例です。実際のプログラムでは、A列では20列以上です。今私は単純なレポートを作成する必要があります。私はそれらのうちの5つまたは6つだけを必要とするときに、完全なオブジェクト(23の列)をロードするのは間違っていると思う。 – Vadim

+0

次に、BプロパティとCプロパティの投影を作成し、オブジェクトグラフを自分で再作成する必要があります。私は23列についてはあまり気にしません。それらを取得するコストは、おそらくジョインでクエリを実行するコストに比べて無視できる程度です。 –

答えて

0

あなたはAクラスのゲッターだけであなたのBエンティティリストにアクセスする必要があります。あなたの場合Set myAobject.getbClassList();

したがって、Aエンティティを取得するためのクエリ/条件を作成するだけで済みます。その後、あなたのセットのゲッターを呼び出し、セットで操作してください。複雑なクエリを作成する必要はありません。 例:currentSession()。get(AclassEnt.class、1);またはcurrentSession()。createCriteria(AclassEnt.class).list(); ...

Lazyフェッチがあり、トランザクション外でアクセスしようとすると、lazyexceptionsが発生します。解決策は、怠惰なフェッチを熱心にすることです。 Setをインスタンス化する必要はありません。

私は確かにドキュメントをチェックしましたが、あなたの単方向のManyToMany関係定義は正しいようです:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ 2.2.5.3.2。多対多

関連する問題