2014-04-03 49 views
0

我想在不使用連接表的情況下實現一對多關係並面臨奇怪的錯誤。任何人都可以幫忙嗎?線程「主」中的異常org.hibernate.PropertyValueException:非空屬性引用空值或瞬態值

User.Java

import java.util.Set; 

public class User { 

    private int id; 
    private Set<Address> addresses; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Set<Address> getAddresses() { 
     return addresses; 
    } 

    public void setAddresses(Set<Address> addresses2) { 
     this.addresses = addresses; 
    } 
} 

Address.java

​​

User.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="User" 
    table="USER"> 
     <id name="id" column="user_id"> 
      <generator class="native"> 
       <param name="sequence">HIBERNATE_SEQUENCE 
       </param> 
      </generator> 
     </id> 
     <set name="addresses" inverse="true"> 
     <key column="address_id"/> 
     <one-to-many class="Address"/> 
    </set> 
    </class> 
</hibernate-mapping> 

** Address.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="Address" 
    table="Address"> 
     <id name="id" column="address_id"> 
      <generator class="native"> 
       <param name="sequence">HIBERNATE_SEQUENCE 
       </param> 
      </generator> 
     </id> 
     <many-to-one name="user" 
     column="user_id" 
     not-null="true"/> 

    </class> 
</hibernate-mapping> 

Tester類

import java.util.ArrayList; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
public class HibernateTest { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    User user = new User(); 
    Address address1 = new Address(); 
    Address address2 = new Address(); 
    Address address3 = new Address(); 
    Address address4 = new Address(); 
    Set<Address> addresses = new HashSet<Address>(); 
    addresses.add(address1);addresses.add(address2);addresses.add(address3);  addresses.add(address4); 
    user.setAddresses(addresses); 
    SessionFactory factory = (new Configuration()).configure().buildSessionFactory(); 
    Session session = factory.openSession(); 
    session.beginTransaction(); 
    session.save(user); 
    session.save(address1); 
    session.save(address2); 
    session.save(address3); 
    session.save(address4); 
    session.getTransaction().commit(); 
    session.close(); 
} 

} 

錯誤staccktrace

Apr 3, 2014 6:50:59 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000230: Schema export complete 
Hibernate: select HIBERNATE_SEQUENCE.nextval from dual 
Hibernate: select HIBERNATE_SEQUENCE.nextval from dual 
Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value : Address.user 
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:106) 
at  org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:132) 
at org.hibernate.action.internal.AbstractEntityInsertAction.makeEntityManaged(AbstractEntityInsertAction.java:141) 
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:199) 
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:177) 
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:164) 
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:332) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:137) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
at HibernateTest.main(HibernateTest.java:38) 

從論壇,我讀的問題將在用戶解決在使用逆= 「真」 .xml,但這是解決問題。

任何人都可以幫忙嗎?

+0

請縮進您的代碼以使其更易於閱讀。 – Naili

回答

0

在user.hbm.xml

改變一對多如下

<set name="addresses" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="address_id" not-null="true" /> 
      </key> 
      <one-to-many class="Address" /> 
     </set> 

並運行它。

非空應在兩個映射文件中都爲true。

執行後讓我知道。

0

在您的映射中,您指定Address實體中的用戶屬性不爲null。

<many-to-one name="user" 
     column="user_id" 
     not-null="true"/> 

但在你的代碼,你要保存的地址爲空的用戶property.You有保存地址1,如果你想將它與用戶關聯之前調用 address1.setUser(user)

編輯: 你犯了一個錯誤的地址設定裝置線

this.addresses = addresses; 

應該

this.addresses = addresses2; 

順便說一句,你可以將這個方法添加到用戶實體

private void associateAddressesWithUser(){ 
    for(Address address : addresses) address.setUser(this); 
} 

,並在地址設置器(在用戶實體上)

public void setAddresses(Set<Address> addresses2) { 
     this.addresses = addresses2; 
     associateAddressesWithUser(); 
    } 
+0

它仍然給出相同的錯誤 –

+0

我更新了答案 – Naili

相關問題