2011-10-25 55 views
4

我得到了weired異常,無法跟蹤它爲什麼如此。請在這裏幫助我。休眠代碼... onetoone映射中的異常

我只是使用OnetoOne映射與PrimarykeyJoinColumn屬性。

@Entity 
@Table(name="mediashow_user1") 
public class UserVO implements Serializable{ 

private static final long serialVersionUID = 6066636545309839156L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long empid ; 

private String email = null; 
private String fname = null ; 
private String lname = null ; 
private String mname = null ; 
private String uname = null ; 
private String passwd = null ; 
private String serctquestion = null ; 
private String serctanswer = null ; 
private int telephone; 
private Timestamp cur_timestamp = null ; 
private Timestamp lastvisited_timestamp = null ; 

@OneToOne(cascade=CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private AddressVO addressVO; 


@Column(name="empid") 
public Long getEmpid() { 
    return empid; 
} 
    .................. 

另一AddressVO.java

@Entity 
@Table(name="mediashow_address1") 
@GenericGenerator(name="foreign", strategy = "foreign", parameters={ 
@Parameter(name="property", value="userVO") 
}) 

public class AddressVO implements Serializable { 


private static final long serialVersionUID = -96886746528894662L; 

@Id 
@GeneratedValue(generator="foreign") 
private Long empid; 

private String street = null ; 
private String zipcode = null ; 
private String landmark = null ; 
    ........ 

    } 


    Transaction transaction = null; 
    try { 
     transaction = session.beginTransaction(); 

     AnnotationConfiguration conf = (new  AnnotationConfiguration()).configure(); 
     new SchemaExport(conf).create(true, false); 

     UserVO user = new UserVO(); 
     user.setEmail("[email protected]"); 
     user.setFname("Rahul10"); 
     user.setMname("Bapusaheb10"); 
     user.setLname("Bandgar10"); 

     user.setUname("rahul"); 
     user.setPasswd("rahul"); 

     user.setSerctanswer("baramati"); 
     user.setSerctquestion("What is your birth place name?"); 

     AddressVO address = new AddressVO(); 
     address.setLandmark("Landmark5"); 
     address.setStreet("street4"); 
     address.setZipcode("234344"); 
     int i = 9850; 
     user.setTelephone(i); 
     user.setAddressVO(address); 

     Long id= (Long)session.save(user); 
     System.out.println("ID::"+id); 

     transaction.commit(); 
    } catch (HibernateException e) { 
     System.out.println("Exception:"+e.getMessage()); 
     transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 

和我得到在運行上面的代碼下面的異常。

ALTER TABLE mediashow_user1 下降 外鍵FK5FD5BCE8801495D

drop table if exists mediashow_address1 

drop table if exists mediashow_user1 

create table mediashow_address1 (
    empid bigint not null, 
    landmark varchar(255), 
    street varchar(255), 
    zipcode varchar(255), 
    primary key (empid) 
) 

create table mediashow_user1 (
    empid bigint not null auto_increment, 
    cur_timestamp datetime, 
    email varchar(255), 
    fname varchar(255), 
    lastvisited_timestamp datetime, 
    lname varchar(255), 
    mname varchar(255), 
    passwd varchar(255), 
    serctanswer varchar(255), 
    serctquestion varchar(255), 
    telephone integer not null, 
    uname varchar(255), 
    primary key (empid) 
) 

alter table mediashow_user1 
    add index FK5FD5BCE8801495D (empid), 
    add constraint FK5FD5BCE8801495D 
    foreign key (empid) 
    references mediashow_address1 (empid) 

Exception in thread "main" java.lang.NullPointerException 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:521) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:3867) 
    at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:100) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) 
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) 
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) 
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) 
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) 
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161) 
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:282) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713) 
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701) 
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697) 
    at com.imgshop.run.TestAddIntoLogin.main(TestAddIntoLogin.java:49) 

回答

5

我遇到類似的情況,經過一番實驗解決它自己。這裏要記住的一件重要事情是,當您使用ID生成器的foreign策略時,關係不能是單向的。在你的情況下,你需要做兩個改變(見下文)。基本上你已經爲AddressVO @OneToOne(cascade=CascadeType.ALL)設置級聯,當你試圖保存UserVO時,這將觸發AddressVO的類似操作。但對於AddressVO,您將Id生成器策略設置爲「外部」,並且屬性爲userVO。但是你從來沒有在AddressVO中設置屬性userVO,所以它得到空id,因此是例外。爲了使這項工作,你需要做以下更改

1)userVO財產(的getter/setter方法)添加到AddressVo和保存userVo在你這個對象添加到addressVO前交易address.setUserVo(user);然後調用session.save(user);

2 )編輯數據庫模式以反映addressVO中的共享主鍵,因爲外鍵約束位於AddressVo中,而不是UserVO中。即,如果你想使這個工作單向一個一對一關係的船,那麼你應該自己處理級聯操作更改以下

alter table mediashow_user1 
add index FK5FD5BCE8801495D (empid), 
add constraint FK5FD5BCE8801495D 
foreign key (empid) 
references mediashow_address1 (empid) 

alter table mediashow_address1 
add index FK5FD5BCE8801495D (empid), 
add constraint FK5FD5BCE8801495D 
foreign key (empid) 
references mediashow_user1 (empid) 

。基本上你應該做以下事情

1)刪除外鍵策略(只需在AddressVO中使用@Id和@column註釋來代替@GeneratedValue)。

2)在UserVO刪除了AddressVo級聯選項(因爲這將觸發AddressVO類似的操作和ID仍然不知道)

3)保存此地址前設置爲EMPID AddressVo。您應該使用您在保存userVo時獲得的id。

Long id= (Long)session.save(user); 
address.setEmpid(id); 
session.save(address) 

基本上你應該處理地址的保存/更新/刪除操作。

希望這有助於解釋:)

+0

只有當我google搜索3+小時後得到正確答案的地方。 – xyz

0

進行此更改您的代碼:

@GenericGenerator(name="foreign", strategy = "foreign", parameters={ 
@Parameter(name="property", value="user") 
}) 

,我們需要通過類而不是類名在參數註解的對象是其價值的參數。 因此不應該有值=「userVO」,應該是值=「用戶」

請嘗試,讓我知道,如果它