簡體   English   中英

休眠一對多映射配置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM