尽管发布了其他所有文章,但在MacOSX和NetBeans 7.2上,我找不到GlassFish的此错误的解决方案。
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")
这里的代码:
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 }
客户.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) { ... } }
产品.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 }
消息很清楚:映射中有重复的列。这意味着您两次映射了相同的数据库列。实际上,您有:
@Column(nullable=false) private Long customerId;
并且:
@ManyToOne(optional=false) @JoinColumn(name="customerId",referencedColumnName="id_customer") private Customer customer;
(productId/也一样product)。
productId
product
您不应通过其他实体的ID来引用它们,而应直接引用该实体。删除该customerId字段,它是无用的。并针对进行相同操作productId。如果您想要销售的客户ID,则只需执行以下操作:
customerId
sale.getCustomer().getId()