2013-06-25 66 views
0

我越來越:爲什麼我會得到映射異常?

org.hibernate.MappingException: Foreign key (FKBB979BF4266AA123:address [a_id])) 
must have same number of columns as the referenced 
primary key (address [p_id,a_id]) 

,因爲我嘗試運行以下(雖然不完整)片段:

public static void main(String args[]) { 
     Configuration config = new Configuration().configure(); 
     SessionFactory sessFact = config.buildSessionFactory(); 
     Session sess = sessFact.openSession(); 
     Transaction trans = sess.beginTransaction();  
    } 

hibernate mapping xml如下所示:

<class name="pojo.Person" table="person"> 
     <id column="p_id" name="personID"> 
      <generator class="increment" /> 
     </id> 
     <property name="personName" column="p_name" /> 
     <set name="addressSet" table="address" cascade="all"> 
      <key column="p_id" /> 
      <many-to-many class="pojo.Address" column="a_id" /> 
     </set> 
</class> 

<class name="pojo.Address" table="address"> 
     <id column="a_id" name="addressID"> 
      <generator class="foreign" /> 
     </id> 
     <property name="address" column="address" /> 
</class> 

我嘗試Person和之間的many to many關聯類。

這個例外的原因是什麼?

我已經創建了兩個表personaddress使用這些SQL命令:

CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id)); 
CREATE TABLE address(a_id INTEGER,address TEXT); 

POJO

public class Person { 
    private int personID; 
    private String personName; 
    private Set addressSet; 

    public int getPersonID() { 
     return personID; 
    } 

    public void setPersonID(int personID) { 
     this.personID = personID; 
    } 

    public String getPersonName() { 
     return personName; 
    } 

    public void setPersonName(String personName) { 
     this.personName = personName; 
    } 

    public Set getAddressSet() { 
     return addressSet; 
    } 

    public void setAddressSet(Set addressSet) { 
     this.addressSet = addressSet; 
    } 

地址

public class Address { 
    private int addressID; 
    private String address; 
    private Set personSet; 

    public int getAddressID() { 
     return addressID; 
    } 

    public void setAddressID(int addressID) { 
     this.addressID = addressID; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public Set getPersonSet() { 
     return personSet; 
    } 

    public void setPersonSet(Set personSet) { 
     this.personSet = personSet; 
    } 

} 
+0

看來你的密鑰由2個相結合的字段和你映射到只有2場1。 – JREN

+0

@JorisRenting解決方案? –

回答

0

你需要創建一個參考表:

CREATE TABLE PersonsAddresses (personId BIGINT, addressId BIGINT) 

,並更改集的映射這樣的:

<set name="addressSet" table="PersonsAddresses" order-by="personId"> 
     <key column="personId" foreign-key="p_id"/> 
     <many-to-many column="addressId" node="a_id" class="pojo.Address" /> 
    </set> 
1

您需要爲許多-to-many關聯指定不同的表名,因爲它是由表格處理:

<class name="pojo.Person" table="person"> 
     <id column="p_id" name="personID"> 
      <generator class="increment" /> 
     </id> 
     <property name="personName" column="p_name" /> 
     <set name="addressSet" table="person_address" cascade="all"> 
      <key column="p_id" /> 
      <many-to-many class="pojo.Address" column="a_id" /> 
     </set> 
</class> 

注意<set>現在引用person_addresses表。通過默認配置,Hibernate可以自動創建它。

我還看到另一個錯誤:Address實體的ID生成器不應該是外部的,它通常用於1對1關係(使用另一個關聯對象的ID)。您可以使用用於Person實體相同的「增量」使用:

<class name="Address" table="address"> 
    <id column="a_id" name="addressID"> 
     <generator class="increment" /> 
    </id> 
    <property name="address" column="address" /> 
</class> 
相關問題