2012-02-01 450 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