休眠一对多映射配置 [英] Hibernate one-to-many mapping configuration

查看:110
本文介绍了休眠一对多映射配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆