我正在研究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」列的雙重實例引起的,但我不確定,也不知道如何解決問題。
任何幫助表示讚賞。
你企圖讓實體執着前值賦給'arcIntId'和'artIntId'?這將有助於發佈導致異常的代碼段(在違規行之前有足夠的行來提供一些上下文)。 – MisterEd 2012-02-01 17:13:33
是的,我使用調試器檢查了值分配給'arcIntId'和'artIntId'。當我做'em.persist(aha)'時拋出異常,'','aha'出現了ArticlecatalogueHasArticle。 – 2012-02-01 17:48:42