JPA: проблема с внешними ключами, несколькими первичными ключами и отношением «многие к одному» - PullRequest
0 голосов
/ 01 февраля 2012

Я работаю над веб-приложением Java / J2EE.Постоянство данных производится 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 не являются нулевыми в сущности, которую я хочу сделать постоянной.Я думаю, что проблема связана с двойным экземпляром столбцов "art_int_id" и "arc_int_id" в ArticlecatalogueHasArticlePK и в ArticlecatalogueHasArticle @JoinColumn, но я не уверен и не знаю, как решить проблему.1011 * Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Убедитесь, что вы устанавливаете значения идентификатора в articlecatalogueHasArticlePK, если вы не установите их, тогда они будут нулевыми.

Вы также можете удалить articlecatalogueHasArticlePK и использовать IdClass вместо EmbeddedId.Тогда вам нужно только поставить @Id на ManyToOne и не нуждаться в дубликатах.

Вы также можете добавить вставляемый / обновляемый false на основы и true на ManyToOne, если вы хотите подобрать идентификаторы.из отношений.

Смотрите, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

0 голосов
/ 01 февраля 2012

Вы должны использовать аннотацию @MapsId для двух ассоциаций ManyToOne.

...