hibernate - teoria - Otra columna repetida en mapeo por error de entidad
serializacion por hibernate (5)
El mensaje es claro: tiene una columna repetida en el mapeo. Eso significa que mapeó la misma columna de la base de datos dos veces. Y de hecho, tienes:
@Column(nullable=false)
private Long customerId;
y también:
@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer")
private Customer customer;
(y lo mismo vale para productId
/ product
).
No debe hacer referencia a otras entidades por su ID, sino mediante una referencia directa a la entidad. Eliminar el campo customerId
, es inútil. Y haz lo mismo con productId
. Si desea la ID de cliente de una venta, solo necesita hacer esto:
sale.getCustomer().getId()
A pesar de todas las otras publicaciones, no puedo encontrar una solución para este error con GlassFish, en 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")
Aquí el código:
Sale.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
}
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 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) {
...
}
}
Producto.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
}
Si está atascado con una base de datos heredada donde alguien ya colocó anotaciones JPA pero NO definió las relaciones y ahora está tratando de definirlas para usarlas en su código, entonces NO podrá eliminar el customerId @Column ya que otro código ya puede referirlo directamente. En ese caso, defina las relaciones de la siguiente manera:
@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;
Esto le permite acceder a las relaciones. Sin embargo, para agregar / actualizar las relaciones, habrá manipulado las claves foráneas directamente a través de sus valores @Column definidos. No es una situación ideal, pero si te entregan este tipo de situación, al menos puedes definir las relaciones para que puedas usar JPQL con éxito.
Tenga cuidado de proporcionar solo 1 setter y getter para cualquier atributo. La mejor forma de acercarse es escribir la definición de todos los atributos y luego usar eclipse generate setter y getter en vez de hacerlo manualmente. La opción aparece al hacer clic derecho-> fuente-> Generar Getter y Setter.
usar esto, es trabajo para mí:
@Column(name = "candidate_id", nullable=false)
private Long candidate_id;
@ManyToOne(optional=false)
@JoinColumn(name = "candidate_id", insertable=false, updatable=false)
private Candidate candidate;
@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 ya ha mapeado una columna y ha establecido accidentalmente los mismos valores para name y referenceColumnName en @JoinColumn hibernate da el mismo error estúpido
Error:
Causado por: org.hibernate.MappingException: columna repetida en el mapeo de la entidad: com.testtest.SomeCustomEntity column: COLUMN_NAME (debe correlacionarse con insert = "false" update = "false")