2012-02-01 3 views
0

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

Любая помощь приветствуется.

+0

ли вы присвоить значения '' arcIntId' и artIntId', прежде чем пытаться сделать лицо настойчив? Это поможет опубликовать фрагмент кода, вызывающий исключение (с достаточным количеством строк, предшествующих строке нарушения, чтобы обеспечить некоторый контекст). – MisterEd

+0

Да, я проверил с помощью отладчика, что значения присваиваются значениям 'arcIntId' и' artIntId'. И исключение было брошено, когда я делал «em.persist (aha)», с «aha» - появление ArticlecatalogueHasArticle. –

ответ

0

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

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

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

See, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

0

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

+0

Проблема заключается в том, что приложение работает на Glassfish 2.xx, поэтому с Java EE 5 SDK и аннотацией @MapsId в нем не существует. –

Смежные вопросы