我正在研究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