2017-12-11 3 views
0

こんにちは私は3つのエンティティを持っています。Java Hibernateマップエンティティリストのリスト@AssociationOverrides

@Entity 
public class A { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    ... 

    private List<BC> bcList; 
} 

@Entity 
public class B { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    ... 

} 

@Entity 
public class C { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    ... 
} 

これらのエンティティは、ManyToManyの関連付けによって互いに関連付けられています。つまり、a_b_c(id_a、id_b、id_c)のような関連テーブルが必要です。 私は、私が欲しいのと同じように動作するAssociationOverridesを作成しました。

@Embeddable 
public class ABCPK implements Serializable { 


    @ManyToOne 
    @JoinColumn(name = "id_a") 
    private A a; 

    @ManyToOne 
    @JoinColumn(name = "id_b") 
    private B b; 

    @ManyToOne 
    @JoinColumn(name = "id_c") 
    private C c; 
    ... 
} 

@Entity 
@Table(name = "a_b_c") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.a", 
       joinColumns = @JoinColumn(name = "id_a",referencedColumnName = "id")), 
     @AssociationOverride(name = "pk.b", 
       joinColumns = @JoinColumn(name = "id_b",referencedColumnName = "id")) , 
     @AssociationOverride(name = "pk.c", 
       joinColumns = @JoinColumn(name = "id_c",referencedColumnName = "id")) }) 
public class ABC{ 

    @EmbeddedId 
    private ABCPK pk=new ABCPK(); 

    @Transient 
    public A getA() { 
     return pk.getA(); 
    } 

    public void setA(A a) { 
     this.pk.setA(a); 
    } 
    ... 


} 

public class BC{ 
    private B b; 
    private List<C> cList; 
} 

しかし、私は私の関連テーブルからリストbcListとリストCLISTを取得したいと思いますが、私は本当に私はそれを行うことができますかわかりません。私はすでに@JoinFormulaを試しましたが、jpqlだけを使って動作させることを推奨します。私を正しい方法で入れてください。 ありがとう

+0

リストを置き換える場合 bcList by HashMap bcMap注釈を使用してこのハッシュマップをどのように埋めることができるか知っていますか? – ScorprocS

答えて

0

私は自分のマップに自分自身を移入して、永続性と更新の前にabcListを作成するように心がけました。しかし、それはパフォーマンスとメモリに優しいことではないので、私は本当にこれが好きではありません。 (abcList約1 * 20 * 70項目)

@Entity 
public class A { 
    ... 
    @OneToMany 
    private List<ABC> abcList; 
    private Map<B,List<C>> bcMap; 

    private Map<B,List<C>> buildBCmap(){ 
     bcMap = new HashMap<>(); 
     if(abcList!=null){ 
      for(ABC abc:abcList){ 
       if(! bcMap.containsKey(abc.getB()){ 
        bcMap.put(abc.getB(),new ArrayList<>()); 
       } 
       bcMap.get(abc.getB()).add(abc.getC()); 
      } 
     } 
     return bcMap; 
    } 

    public Map<B,List<C>> getBcMap(){ 
     if(bcMap==null){ 
      buildBCmap(); 
     } 
     return bcMap; 
    } 

    @PrePersist 
    @PreUpdate 
    public void buildAbcList(){ 
     if(bcMap!=null){ 
      abcList=new ArrayList<>(); 
      for(B b: bcMap.keySet()){ 
       for(C c: bcMap.get(b)){ 
        abcList.add(new ABC(this,b,c)); 
       } 
      } 
     } 

    } 
} 

誰でもassociationOverrideエンティティからマップを移入するためのより良いか、より高速な方法がありますか?

関連する問題