我是hibernate的新手,我正在尝试通过级联加载和更新来实现一对多的关系。但是,我的代码总是生成org.apache.jasper.JasperException: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
异常。你能看看我的尝试并建议我做错了吗?
一般的想法是,有一个公司类包含一组客户。在创建新的客户实例时,我将他加入公司并坚持下去。
实体(仅显示相关部分,或者至少我希望如此)
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
答案 0 :(得分:3)
因为这是一个映射异常,我想它会在创建会话工厂期间出现,而不是在保存时出现?另外,看到整个堆栈跟踪可能会有所帮助。您的异常可能是由映射文件和bean之间的属性名称不匹配引起的。见Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister。
在您的代码中,您在
中拥有名称属性值<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。
答案 1 :(得分:0)
hibernate中的一个原则,即经常陈述,但更经常被监督的是,你需要保持一个干净的对象树,否则数据库将无法保持正确同步。
我认为这会导致您的问题:您需要保持树清洁。但您不是:您在客户端将客户添加到公司,但您没有将客户添加到公司的客户集中。
在您的代码中,您在客户和公司之间添加了反之亦然的链接。我会添加一个反向链接,因为这是你想要的。
第二:如果你现在开始使用hibernate,那么请考虑注释方法。如果您继承遗留应用程序,请继续使用XML,但如果您刚开始使用...