2016-08-12 262 views
0

我有以下兩類:休眠一一對一映射問題

public class User { 

    private int id; 
    private String name; 
    private ProteinData proteinData; 

    public User(){ 
     setProteinData(new ProteinData()); 
    } 

    public ProteinData getProteinData() { 
     return proteinData; 
    } 
    public void setProteinData(ProteinData proteinData_) { 
     this.proteinData = proteinData_; 
     proteinData_.setUser(this); 
    } 

    // additional getters and setters 

} 


public class ProteinData { 

    private int id; 
    private User user; 


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

    public User getUser() { 
     return user; 
    } 
    public void setUser(User user) { 
     this.user = user; 
    } 
} 

映射文件是::

//User 
<hibernate-mapping> 
    <class name="com.simpleprogrammer.User" table="USERS"> 
     <meta attribute="class-description"> 
     This class contains the User detail. 
     </meta> 
     <id name="id" type="int"> 
     <column name="ID" /> 
     <generator class="identity"/> 
     </id> 
     <property name="name" type="java.lang.String"> 
     <column name="NAME" /> 
     </property> 

     <one-to-one name="proteinData" class="com.simpleprogrammer.ProteinData" cascade="save-update"/> 
</hibernate-mapping> 

// proteinData 
<hibernate-mapping> 
    <class name="com.simpleprogrammer.ProteinData" table="PROTEINDATA"> 
     <id name="id" type="int"> 
      <column name="ID" /> 
      <generator class="foreign"> 
       <param name="property">user</param> 
      </generator> 
     </id> 
     <one-to-one name="user" class="com.simpleprogrammer.User" constrained="true"> 
     </one-to-one> 
     <property name="total" type="int" column="TOTAL" /> 
     <property name="goal" type="int"> 
      <column name="GOAL"/> 
     </property> 
    </class> 
</hibernate-mapping> 

現在我跑的時候我的申請,我得到以下錯誤: :

Exception in thread "main" org.hibernate.PropertyAccessException: Exception occurred inside setter of com.simpleprogrammer.User.proteinData 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:88) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:710) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371) 
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4509) 
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:186) 
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137) 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1108) 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:964) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:911) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:312) 
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2121) 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3927) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:145) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092) 
    at org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:1007) 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:173) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) 
    at com.simpleprogrammer.User_$$_javassist_0.getName(User_$$_javassist_0.java) 
    at com.pluralsight.Introduction_To_Hibernate_Pluralsight.Program.main(Program.java:45) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65) 
    ... 25 more 
Caused by: java.lang.NullPointerException 
    at com.simpleprogrammer.User.setProteinData(User.java:44) 
    ... 30 more 

的錯誤來自setProteinData()在方法用戶類。錯誤中的最後一條語句顯示java.lang.NullPointerException並指向該方法。我不知道什麼是錯的。

感謝您的幫助

回答

0

我認爲這個問題是,你不必在你的ProteinData類空(無參數)構造函數。嘗試將它添加到類:從setProteinData方法proteinData_.setUser(this);

public ProteinData(){} 
0

刪除呼叫。這不是必需的。如果沒有其他構造函數(無論是否爲arg或構造函數),編譯器將創建默認構造函數,如果沒有其他構造函數(或者不帶參數或構造函數),則可以使用no-arg構造函數參數)出現在你的課堂上。

您可以在hibernate here中閱讀關於無參數構造函數需求的更多討論。

+0

'proteinData_.setUser(this);'可以沒有任何問題,因爲他想在'User'類中的實體之間設置關聯 – Rocherlee