Hibernate一对多映射配置

时间:2015-03-28 11:18:24

标签: java hibernate

我是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

2 个答案:

答案 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,但如果您刚开始使用...