165 votes

Une autre erreur de colonne répétée dans le mapping de l'entité

Malgré tous les autres posts, je ne trouve pas de solution pour 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 :

Vente.java

@Entity
public class Sale {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable=false)
    private Long idFromAgency;

    private float amountSold;

    private String 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, String agency
            , Date createDate, Long productId, Long customerId){        
        ...
    }

    // then getters/setters
}

Client.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 String  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, String gender, String maritalState,
            String firstname, String lastname, String 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 String name;

    @OneToMany(mappedBy="product",targetEntity=Sale.class, fetch=FetchType.EAGER)
    private Collection sales;

    //constructors + getters +setters
}

196voto

JB Nizet Points 250258

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

@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 ID, mais par une référence directe à l'entité. Supprimez le customerId champ, c'est inutile. Et faites la même chose pour productId . Si vous voulez l'ID du client d'une vente, il suffit de faire ceci :

sale.getCustomer().getId()

103voto

pattmatt Points 871

Si vous êtes coincé avec une ancienne base de données sur laquelle quelqu'un 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 les utiliser dans votre code, il se peut que vous ne puissiez PAS supprimer l'identifiant client. @Column puisque d'autres codes peuvent déjà y faire directement référence. 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 ajouter/mettre à jour les relations, vous devrez manipuler les clés étrangères directement via leurs clés définies. @Column valeurs. Ce n'est pas une situation idéale, mais si vous vous trouvez dans ce genre de situation, vous pouvez au moins définir les relations de manière à pouvoir utiliser JPQL avec succès.

36voto

Redouane nomade Points 321

Utiliser ça, 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;

11voto

dbow Points 83
@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<SomeCustomEntity> getAbschreibareAustattungen() {
    return abschreibareAustattungen;
}

Si vous avez déjà mappé une colonne et que vous avez accidentellement défini les mêmes valeurs pour la colonne name y Nom de la colonne référencée en @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é : com.testtest.SomeCustomEntity colonne : COLUMN_NAME (doit être mappé avec insert="false" update="false")

1voto

Multi Cabz Points 11

J'espère que cela vous aidera !

@OneToOne(optional = false)
    @JoinColumn(name = "department_id", insertable = false, updatable = false)
    @JsonManagedReference
    private Department department;

@JsonIgnore
    public Department getDepartment() {
        return department;
    }

@OneToOne(mappedBy = "department")
private Designation designation;

@JsonIgnore
    public Designation getDesignation() {
        return designation;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X