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
}

0voto

romil gaurav Points 1041

Veillez à ne fournir qu'un seul setter et getter pour chaque attribut. La meilleure façon de procéder est d'écrire la définition de tous les attributs 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 -> Generate Getter and Setter.

0voto

Rishabh Agarwal Points 165

Cela signifie que vous mappez une colonne deux fois dans votre classe d'entité. Explication avec un exemple...

    @Column(name = "column1")
    private String object1;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "column1", referencedColumnName = "column1")
    private TableClass object2;

Le problème dans l'extrait de code ci-dessus est que nous répétons le mappage...

Solution

Comme la cartographie est une partie importante, vous ne voulez pas la supprimer. Au lieu de cela, vous allez supprimer

    @Column(name = "column1")
    private String uniqueId;

Vous pouvez toujours passer la valeur de l'objet 1 en créant un objet de TableClass et en lui attribuant la valeur String de l'objet 1.

Cela fonctionne à 100%. Je l'ai testé avec la base de données Postgres et Oracle.

0voto

Nous avons résolu le problème de dépendance circulaire (entités parent-enfant) en mappant l'entité enfant au lieu de l'entité parent dans Grails 4 (GORM).

Exemple :

Class Person {
    String name
}

Class Employee extends Person{
    String empId
}

//Before my code 
Class Address {
    static belongsTo = [person: Person]
}

//We changed our Address class to:
Class Address {
    static belongsTo = [person: Employee]
}

0voto

J'avais ajouté par erreur l'annotation OneToMany à deux endroits où elle n'était pas nécessaire, je l'ai supprimée et cela a résolu le problème.

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