【问题标题】:JPA : Issue with foreign keys, multiple primary keys and many to one relationJPA:外键、多个主键和多对一关系的问题
【发布时间】:2012-02-01 17:05:53
【问题描述】:

我正在开发一个 Java/J2EE Web 应用程序。数据的持久化由 JPA/TopLink 完成。我对这个实体有疑问:

    @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 不为空。我认为问题是由于 ArticlecatalogueHasArticlePK 和 ArticlecatalogueHasArticle @JoinColumn 中的列“art_int_id”和“arc_int_id”的双重实例,但我不确定,我不知道如何解决问题。

感谢任何帮助。

【问题讨论】:

  • 在尝试使实体持久化之前,您是否为arcIntIdartIntId 分配了值?发布导致异常的代码 sn-p 会有所帮助(在违规行之前有足够多的行以提供一些上下文)。
  • 是的,我用调试器检查了值分配给arcIntIdartIntId。当我执行em.persist(aha); 时抛出异常,aha 出现了 ArticlecatalogueHasArticle。

标签: java hibernate jakarta-ee jpa toplink


【解决方案1】:

确保您在 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

【讨论】:

    【解决方案2】:

    您必须在两个多对一关联上使用@MapsId 注释。

    【讨论】:

    • 问题是应用程序在 Glassfish 2.xx 上运行,因此使用 Java EE 5 SDK 并且其中不存在注释 @MapsId。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多