[英]Hibernate one-to-many mapping configuration
我是新來的冬眠者,我正在嘗試通過級聯加載和更新實現一對多關系。 但是,我的代碼總是生成org.apache.jasper.JasperException: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
異常的org.apache.jasper.JasperException: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
。 您能看看我的嘗試,並建議我做錯了什么嗎?
總體思路是,存在一個Company類,其中包含一組客戶。 創建新的客戶實例時,我將其添加到公司中並保留所有內容。
實體(僅顯示相關部分,或者至少希望如此)
public class Company implements Serializable {
private static final long serialVersionUID = 146243652;
private String id;
private String name;
private String website;
private Set<Customer> customers;
... getters, setters etc
public class Customer implements Serializable {
private static final long serialVersionUID = 864235654;
private String name;
private String surname;
private String adress;
private String id;
private Company company;
customer.hbm.xml:
<hibernate-mapping>
<class name="wa2.entities.Customer" table="CUSTOMER">
<id column="ID" name="id" type="java.lang.String" />
<property column="NAME" name="name" type="java.lang.String" />
<property column="SURNAME" name="surname" type="java.lang.String" />
<property column="ADRESS" name="adress" type="java.lang.String" />
<many-to-one name="COMPANY" class="wa2.entities.Company">
<column name="COMPANY_ID" not-null="true"></column>
</many-to-one>
</class>
</hibernate-mapping>
company.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="wa2.entities.Company" table="COMPANY">
<id column="ID" name="id" type="java.lang.String" />
<property column="NAME" name="name" type="java.lang.String" />
<property column="WEBSITE" name="website" type="java.lang.String" />
<set name="CUSTOMERS" table="CUSTOMER" fetch="select">
<key>
<column name="CUSTOMER_ID" not-null="true"></column>
</key>
<one-to-many class="wa2.entities.Customer"/>
</set>
</class>
</hibernate-mapping>
節省客戶(這在實現一對多關系之前有效,因此我懷疑這段代碼有什么問題):
Customer customer = new Customer();
String name = req.getParameter("name");
customer.setName(name);
String surname = req.getParameter("surname");
customer.setSurname(surname);
String adress = req.getParameter("adress");
customer.setAdress(adress);
String companyID = req.getParameter("companyId");
Company company = repository.loadCompany(companyID);
customer.setCompany(company);
String id = UUID.randomUUID().toString();
customer.setId(id);
repository.saveCustomer(customer);
我希望我不要忘記任何相關部分。 如果是這樣,請告訴我,我將發布相關代碼。 非常感謝您的幫助!
編輯:感謝您的答復。 看來我在大寫字母中寫錯了名字。 我改變了這一點,現在我failed to lazily initialize a collection of role: wa2.entities.Company.customers, could not initialize proxy - no Session
由於這是一個映射異常,我想它是在會話工廠創建期間出現的,而不是在保存時出現的? 同樣,查看整個stacktrace也會有所幫助。 您的異常可能是由於映射文件和Bean之間的屬性名稱不匹配引起的。 請參閱無法獲取org.hibernate.persister.entity.SingleTableEntityPersister的構造方法 。
在您的代碼中,您具有name屬性值
<many-to-one name="COMPANY" class="wa2.entities.Company">
<column name="COMPANY_ID" not-null="true"></column>
</many-to-one>
和
<set name="CUSTOMERS" table="CUSTOMER" fetch="select">
<key>
<column name="CUSTOMER_ID" not-null="true"></column>
</key>
<one-to-many class="wa2.entities.Customer"/>
</set>
大寫字母,而pojos中的屬性分別命名為company和customer。
休眠狀態中經常提到的一個原則,但是經常被監督的一個原則是,您需要保持干凈的對象樹,否則數據庫將無法正確同步。
我認為這會引起您的問題:您需要保持樹的清潔。 但是您沒有:在客戶方將客戶添加到公司中,但沒有將客戶添加到公司的客戶集中。
在您的代碼中,您已經在客戶和公司之間添加了反之亦然的鏈接。 我會在鏈接中添加一個逆,因為這就是您想要的。
第二:如果您現在從休眠入手,請真正考慮一下注釋方法。 如果您繼承了舊版應用程序,請繼續使用XML,但是如果您重新開始使用...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.