2011-06-22 7 views
1

私はアプリケーションエンティティを持って、JPAの属性との自己双方向の関係を表現したい。 EX。上記の方法は、関係がManyToManyではあるが、自己ではない場合にうまく機能します(ex。 App2DBまたはApp2BizCase) アプリケーションエンティティの属性を持つ自己双方向ManyToMany関係の場合。私はここで自己ManyToMany JPA 2.0を使用して追加の列を持つ


App 1--One2Many--* App2AppLink *--ManyToOne-1 App 
(Provider 1--One2Many--* App2AppLink *--ManyToOne-1 Consumer) 

のような2つのOneToMany関係にそれを分解するアプリケーションエンティティは、ここで

@Entity 
public class ApplicationEO { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    /** 
    * This application instance services are consumed by Set<App2AppLinkEO> applications connections/links 
    */ 
    @OneToMany(mappedBy = "provider") 
    private Set<App2AppLinkEO> consumberLinks; 

    /** 
    * This application instance consumes services by Set<App2AppLinkEO> applications connections/links 
    */ 
    @OneToMany(mappedBy = "consumer") 
    private Set<App2AppLinkEO> providerLinks; 

} 

あるアプリケーションは、アプリケーション関係テーブルに

@Entity 
@Table(name="APP2APPLINK") 
public class App2AppLinkEO { 

    @EmbeddedId 
    @AttributeOverrides({@AttributeOverride(name = "entity1Id", column = @Column(name = "PROVIDER_ID")), 
     @AttributeOverride(name = "entity2Id", column = @Column(name = "CONSUMBER_ID"))}) 

    private CompositePK id; 

    @ManyToOne(optional = false) 
    private ApplicationEO providerApp; 

    @ManyToOne(optional = false) 
    private ApplicationEO consumerApp; 

    private String service; 

    private String status; 

    private String platform; 
} 

です

そして、ここで複合主キーコード設定の上

@Embeddable 
public class CompositePK implements Serializable { 

    private long entity1Id; 

    private long entity2Id; 
} 

あるとして関係テーブルを生成します。

CREATE TABLE APP2APPLINK (
          PLATFORM VARCHAR(255), 
          STATUS VARCHAR(255), 
          SERVICE VARCHAR(255), 
          PROVIDER_ID BIGINT NOT NULL, 
          CONSUMBER_ID BIGINT NOT NULL, 
          CONSUMERAPP_ID BIGINT, 
          PROVIDERAPP_ID BIGINT, 
          PRIMARY KEY (PROVIDER_ID, CONSUMBER_ID)) 

しかし、なぜ私はそこに余分な列の下に見ていますか?

CONSUMERAPP_ID BIGINT, 
PROVIDERAPP_ID BIGINT, 

答えて

1

@ ManyToOneに@JoinColumnを設定していないため、デフォルトの結合列名が取得されます。あなたは

あなたEmbeddedIdからフィールドを書いているとあなたが読み取り専用としてマークする必要があります(またはあなたが偽=更新可能、偽=挿入可能としてマークできる)、

@JoinColumn(name="PROVIDER_ID", insertable=false, updateable=false) 

@JoinColumn(name="CONSUMBER_ID", insertable=false, updateable=false) 

を与える必要がある。しかし実際にはEmbeddedIdを完全に削除し、@ ManyToOneに@Idを追加し、@IdClassを定義するだけです。

+0

ありがとうございました。 –

関連する問題