2012-02-01 453 views
0

我正在研究Java/J2EE Web應用程序。數據的持久性由JPA/TopLink完成。我有這個實體的一個問題:JPA:與外鍵,多個主鍵和多對一關係問題

@Entity 
@Table(name = "articlecatalogue_has_article", catalog = "artisance", schema = "public") 
@NamedQueries({@NamedQuery(name = "ArticlecatalogueHasArticle.findAll", query = "SELECT a FROM ArticlecatalogueHasArticle a"), @NamedQuery(name = "ArticlecatalogueHasArticle.findByArcIntId", query = "SELECT a FROM ArticlecatalogueHasArticle a WHERE a.articlecatalogueHasArticlePK.arcIntId = :arcIntId"), @NamedQuery(name = "ArticlecatalogueHasArticle.findByArtIntId", query = "SELECT a FROM ArticlecatalogueHasArticle a WHERE a.articlecatalogueHasArticlePK.artIntId = :artIntId"), @NamedQuery(name = "ArticlecatalogueHasArticle.findByAhaDecQuantite", query = "SELECT a FROM ArticlecatalogueHasArticle a WHERE a.ahaDecQuantite = :ahaDecQuantite"), @NamedQuery(name = "ArticlecatalogueHasArticle.findByAhaDecPrixvente", query = "SELECT a FROM ArticlecatalogueHasArticle a WHERE a.ahaDecPrixvente = :ahaDecPrixvente")}) 
public class ArticlecatalogueHasArticle implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected ArticlecatalogueHasArticlePK articlecatalogueHasArticlePK; 
    @Column(name = "aha_dec_quantite") 
    private BigDecimal ahaDecQuantite; 
    @Column(name = "aha_dec_prixvente") 
    private BigDecimal ahaDecPrixvente; 
    @JoinColumn(name = "art_int_id", referencedColumnName = "art_int_id", insertable = false, updatable = false) 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Article article; 
    @JoinColumn(name = "arc_int_id", referencedColumnName = "arc_int_id", insertable = false, updatable = false) 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Articlecatalogue articlecatalogue; 

而且多個主鍵:

@Embeddable 
public class ArticlecatalogueHasArticlePK implements Serializable { 
    @Basic(optional = false) 
    @Column(name = "arc_int_id") 
    private int arcIntId; 
    @Basic(optional = false) 
    @Column(name = "art_int_id") 
    private int artIntId; 

當我嘗試再接再厲的ArticlecatalogueHasArticle實體我有這樣以下錯誤:

Local Exception Stack: 
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne « arc_int_id » 
Error Code: 0 
Call: INSERT INTO artisance.public.articlecatalogue_has_article (aha_dec_prixvente, aha_dec_quantite, art_int_id, arc_int_id) VALUES (?, ?, ?, ?) 
    bind => [null, 1, null, null] 

而我想持久化的實體中字段arcIntId和artIntId不爲null。我認爲問題是由ArticlecatalogueHasArticlePK和ArticlecatalogueHasArticle @JoinColumn中的「art_int_id」和「arc_int_id」列的雙重實例引起的,但我不確定,也不知道如何解決問題。

任何幫助表示讚賞。

+0

你企圖讓實體執着前值賦給'arcIntId'和'artIntId'?這將有助於發佈導致異常的代碼段(在違規行之前有足夠的行來提供一些上下文)。 – MisterEd 2012-02-01 17:13:33

+0

是的,我使用調試器檢查了值分配給'arcIntId'和'artIntId'。當我做'em.persist(aha)'時拋出異常,'','aha'出現了ArticlecatalogueHasArticle。 – 2012-02-01 17:48:42

回答

0

確保您正在設置articlecatalogueHasArticlePK中的id值,如果您未設置它們,則它們將爲空。

您也可以刪除articlecatalogueHasArticlePK,並使用IdClass而不是EmbeddedId。然後你只需要在你的ManyToOne上放置@Id,而不需要任何重複。

如果您想從關係中選擇ID,您也可以在基礎上放置可插入/可更新的false,在ManyToOne上放置true。

見, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

0

您必須在兩個ManyToOne關聯上使用@MapsId註釋。

+0

問題是應用程序在Glassfish 2.xx上運行,因此使用Java EE 5 SDK和@MapsId註釋不存在於其中。 – 2012-02-01 19:54:25