休眠一对多映射配置 [英] Hibernate one-to-many mapping configuration
问题描述
我是hibernate的新手,我试图通过级联加载和更新来实现一对多的关系。然而,我的代码总是生成 org.apache.jasper.JasperException:org.hibernate.MappingException:无法获取org.hibernate.persister.entity.SingleTableEntityPersister
异常的构造函数。你能看看我的尝试,并建议我做错了什么?
总体思路是有一个公司类,其中包含一组客户。在创建客户的新实例时,我将他添加到公司并坚持一切。
实体(仅显示相关部分,或者至少我希望如此)
public class Company实现Serializable {
private static final long serialVersionUID = 146243652;
私人字符串ID;
私人字符串名称;
私人字符串网站;
私人套餐< Customer>顾客;
... getters,setters等
public class Customer实现Serializable {
private static final long serialVersionUID = 864235654;
私人字符串名称;
私人字符串姓氏;
私人字符串地址;
私人字符串ID;
私人公司公司;
customer.hbm.xml:
< hibernate-mapping>
< class name =wa2.entities.Customertable =CUSTOMER>
< id column =IDname =idtype =java.lang.String/>
< property column =NAMEname =nametype =java.lang.String/>
< property column =SURNAMEname =surnametype =java.lang.String/>
< property column =ADRESSname =adresstype =java.lang.String/>
<多对一名称=COMPANYclass =wa2.entities.Company>
< column name =COMPANY_IDnot-null =true>< / column>
< /多对一>
< / class>
< / hibernate-mapping>
company.hbm.xml:
<?xml version =1.0encoding =UTF-8?>
<!DOCTYPE hibernate-mapping PUBLIC - // Hibernate / Hibernate映射DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"> ;
< hibernate-mapping>
< class name =wa2.entities.Companytable =COMPANY>
< id column =IDname =idtype =java.lang.String/>
< property column =NAMEname =nametype =java.lang.String/>
< property column =WEBSITEname =websitetype =java.lang.String/>
< set name =CUSTOMERStable =CUSTOMERfetch =select>
< key>
< column name =CUSTOMER_IDnot-null =true>< / column>
< / key>
<一对多课程=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);
字符串companyID = req.getParameter(companyId);
Company company = repository.loadCompany(companyID);
customer.setCompany(company);
String id = UUID.randomUUID()。toString();
customer.setId(id);
repository.saveCustomer(customer);
我希望我没有忘记任何相关部分。如果是这样,请告诉我,我会发布相关的代码。非常感谢您的帮助!
编辑:
感谢您的回应。我似乎错误地在首都写了这些名字。我改变了这一点,现在我得到未能懒惰地初始化一个角色集合:wa2.entities.Company.customers,无法初始化代理 - 没有会话
因为这是一个映射异常,我想它会在会话工厂创建期间出现,而不是在保存时出现?另外,看到整个堆栈跟踪可能会有所帮助。您的异常可能是由于映射文件和Bean之间的属性名称不匹配造成的。请参阅无法获取org.hibernate.persister的构造函数。 entity.SingleTableEntityPersister 。
在您的代码中,您的名称属性值为
<多对一名称=COMPANYclass =wa2.entities.Company>
< column name =COMPANY_IDnot-null =true>< / column>
< /多对一>
和
< set name =CUSTOMERStable =CUSTOMERfetch =select>
< key>
< column name =CUSTOMER_IDnot-null =true>< / column>
< / key>
<一对多课程=wa2.entities.Customer/>
< / set>
大写,而pojos中的属性被命名为company和customer。
I am new to hibernate and I am trying to implement one-to-many relationship with cascade loading and updating. However, my code always generates org.apache.jasper.JasperException: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
exception. Could you take a look on my attempt and suggest what am I doing wrong?
The general idea is that there is a Company class which contains set of customers. When creating new instance of customer, I add him to a company and persist everything.
Entities (only displaying relevant parts, or at least I hope so)
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>
Saving customer (this worked before the implementation of one-to-many relationship so I doubt that there is anything wrong with this code):
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);
I hope that I did not forget any relevant part. If so, please tell me and I will post the relevant code. Thank you very much for any help!
EDIT:
Thanks for the responses. It seems that I wrote the names wrongly in capitals. I changed that and now I am getting failed to lazily initialize a collection of role: wa2.entities.Company.customers, could not initialize proxy - no Session
since this is an mapping exception, i guess it comes up during session factory creation, and not when saving? also, seeing the whole stacktrace could help. your exception can be caused by a mismatch of property names between mapping file and beans. see Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister.
in your code you have the name attribute values in
<many-to-one name="COMPANY" class="wa2.entities.Company">
<column name="COMPANY_ID" not-null="true"></column>
</many-to-one>
and
<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>
in uppercase, while the properties in your pojos are named company and customer.
这篇关于休眠一对多映射配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!