他のすべての投稿にもかかわらず、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
}
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) {
...
}
}
Product.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
}
メッセージは明確です。マッピングに繰り返し列があります。つまり、同じデータベース列を2回マッピングしました。そして確かに、あなたは持っています:
@Column(nullable=false)
private Long customerId;
また:
@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer")
private Customer customer;
(およびproductId
/product
についても同じことが言えます)。
他のエンティティをIDで参照するのではなく、エンティティへの直接参照で参照する必要があります。 customerId
フィールドを削除してください、それは役に立ちません。 productId
についても同じことを行います。セールの顧客IDが必要な場合は、これを行うだけです。
sale.getCustomer().getId()
誰かが既にJPAアノテーションを配置しているが、リレーションシップを定義していないレガシーデータベースで立ち往生しており、コードで使用するためにそれらを定義しようとしている場合、他のコードからcustomerId @Columnを削除できない可能性があります既に直接参照する場合があります。その場合、次のように関係を定義します。
@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;
これにより、関係にアクセスできます。ただし、関係に追加/更新するには、定義された@Column値を介して外部キーを直接操作する必要があります。理想的な状況ではありませんが、この種の状況を手にした場合、少なくともJPQLを正常に使用できるように関係を定義できます。
これを使用して、私のために仕事です:
@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;
}
すでに列をマップしていて、誤ってnameとreferencedColumnName in @ JoinColumnに同じ値を設定した場合、hibernateは同じ愚かなエラーを返します
エラー:
原因:org.hibernate.MappingException:エンティティのマッピングで繰り返される列:com.testtest.SomeCustomEntity列:COLUMN_NAME(insert = "false" update = "false"でマップされる必要があります)
すべての属性に対して1つのセッターとゲッターのみを提供するように注意してください。アプローチする最良の方法は、すべての属性の定義を書き留めてから、手動で行うのではなく、Eclipseの生成セッターおよびゲッターユーティリティを使用することです。このオプションは、右クリック->ソース-> GetterおよびSetterの生成にあります。