Une autre colonne répétée dans le mappage de l’erreur d’entité

Malgré tous les autres post, je ne trouve pas de solution à cette erreur avec GlassFish, sur MacOSX, NetBeans 7.2.

Here the error : SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method SEVERE: Exception while preparing the app SEVERE: [PersistenceUnit: supmarket] Unable to build EntityManagerFactory ... Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.supmarket.entity.Sale column: customerId (should be mapped with insert="false" update="false") 

Voici le code:

Sale.java

 @Entity public class Sale { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable=false) private Long idFromAgency; private float amountSold; private Ssortingng agency; @Temporal(javax.persistence.TemporalType.DATE) private Date createdate; @Column(nullable=false) private Long productId; @Column(nullable=false) private Long customerId; @ManyToOne(optional=false) @JoinColumn(name="productId",referencedColumnName="id_product") private Product product; @ManyToOne(optional=false) @JoinColumn(name="customerId",referencedColumnName="id_customer") private Customer customer; public void Sale(){} public void Sale(Long idFromAgency, float amountSold, Ssortingng agency , Date createDate, Long productId, Long customerId){ ... } // then getters/setters } 

Customer.java

 @Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="id_customer") private Long id_customer; @Column(nullable=false) private Long idFromAgency; private Ssortingng gender, maritalState, firstname, lastname, incomeLevel; @OneToMany(mappedBy="customer",targetEntity=Sale.class, fetch=FetchType.EAGER) private Collection sales; public void Customer(){} public void Customer(Long idFromAgency, Ssortingng gender, Ssortingng maritalState, Ssortingng firstname, Ssortingng lastname, Ssortingng incomeLevel) { ... } } 

Produit.java

 public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="id_product") private Long id_product; @Column(nullable=false) private Long idFromAgency; private Ssortingng name; @OneToMany(mappedBy="product",targetEntity=Sale.class, fetch=FetchType.EAGER) private Collection sales; //constructors + getters +setters } 

Le message est clair: vous avez une colonne répétée dans le mappage. Cela signifie que vous avez mappé la même colonne de firebase database deux fois. Et en effet, vous avez:

 @Column(nullable=false) private Long customerId; 

et aussi:

 @ManyToOne(optional=false) @JoinColumn(name="customerId",referencedColumnName="id_customer") private Customer customer; 

(et il en va de même pour productId / product ).

Vous ne devez pas référencer d’autres entités par leur identifiant, mais par une référence directe à l’entité. Supprimez le champ customerId , c’est inutile. Et faites de même pour productId . Si vous voulez l’identifiant client d’une vente, il vous suffit de le faire:

 sale.getCustomer().getId() 

Si vous êtes coincé avec une firebase database héritée où une personne a déjà placé des annotations JPA mais n’a pas défini les relations et que vous essayez maintenant de les définir pour une utilisation dans votre code, vous ne pourrez peut-être pas supprimer le customerId @Column peut directement le référencer déjà. Dans ce cas, définissez les relations comme suit:

 @ManyToOne(optional=false) @JoinColumn(name="productId",referencedColumnName="id_product", insertable=false, updatable=false) private Product product; @ManyToOne(optional=false) @JoinColumn(name="customerId",referencedColumnName="id_customer", insertable=false, updatable=false) private Customer customer; 

Cela vous permet d’accéder aux relations. Cependant, pour append / mettre à jour les relations, vous devrez manipuler les clés étrangères directement via leurs valeurs @Column définies. Ce n’est pas une situation idéale, mais si vous êtes confronté à ce genre de situation, vous pouvez au moins définir les relations pour pouvoir utiliser JPQL avec succès.

 @Id @Column(name = "COLUMN_NAME", nullable = false) public Long getId() { return id; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = SomeCustomEntity.class) @JoinColumn(name = "COLUMN_NAME", referencedColumnName = "COLUMN_NAME", nullable = false, updatable = false, insertable = false) @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) public List getAbschreibareAustattungen() { return abschreibareAustattungen; } 

Si vous avez déjà mappé une colonne et que vous avez défini accidentellement les mêmes valeurs pour nom et namedColumnName dans @JoinColumn, hibernate donne la même erreur stupide

Erreur:

Causé par: org.hibernate.MappingException: colonne répétée dans le mappage de l’entité: colonne com.testtest.SomeCustomEntity: COLUMN_NAME (doit être mappé avec insert = “false” update = “false”)

utilisez ceci, c’est du travail pour moi:

 @Column(name = "candidate_id", nullable=false) private Long candidate_id; @ManyToOne(optional=false) @JoinColumn(name = "candidate_id", insertable=false, updatable=false) private Candidate candidate; 

Veillez à ne fournir qu’un seul setter et getter pour tout atsortingbut. La meilleure façon d’envisager est d’écrire la définition de tous les atsortingbuts, puis d’utiliser l’utilitaire eclipse generate setter et getter plutôt que de le faire manuellement. L’option vient sur le clic droit-> source -> Générer Getter et Setter.