首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

hibernate主表保存从表保存不了,该如何处理

2012-02-24 
hibernate主表保存从表保存不了主表配置?xml version1.0?!DOCTYPE hibernate-mapping PUBLIC-//Hib

hibernate主表保存从表保存不了
主表配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

<class name="notes.po.NotesPO"
table="OA_NOTES" schema="OFFICE">

<id name="notesID" type="java.lang.String" column="NOTESID">
<generator class="assigned" />
</id>

<property name="notesTitle" type="java.lang.String" column="NOTESTITLE"
length="200" />

<set name="notesMsg" table="OA_NOTESMSG" 
lazy="true" inverse="false" cascade="all">
<key column="NOTESID" />
<one-to-many class="notes.po.NotesMsgPO" />
</set>

</class>
</hibernate-mapping>

从表配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin

http://boss.bekk.no/boss/middlegen/ http://hibernate.sourceforge.net/
-->

<class name="notes.po.NotesMsgPO"
table="OA_NOTESMSG" schema="OFFICE">

<id name="msgID" type="java.lang.String" column="MSGID">
<generator class="assigned" />
</id>

<property name="userName" type="java.lang.String" column="USERNAME"
length="100" />

<many-to-one name="notes"
class="notes.po.NotesPO" column="NOTESID"
insert="true" update="true" />

</class>
</hibernate-mapping>

主表实体
public class NotesPO implements Serializable {
private String notesID;
private String notesTitle;

private Set notesMsg = new HashSet();

public NotesPO() {

}

public String getNotesID() {
return this.notesID;
}

public String getNotesTitle() {
return this.notesTitle;
}


public Set getNotesMsg() {
return this.notesMsg;
}



public void setNotesID(String notesID) {
this.notesID = notesID;
}

public void setNotesTitle(String notesTitle) {
this.notesTitle = notesTitle;
}

public void setNotesMsg(Set notesMsg) {
this.notesMsg = notesMsg;
}



public boolean equals(Object other) {
if (!(other instanceof NotesPO)) {
return false;
}
NotesPO castOther = (NotesPO) other;
return new EqualsBuilder().append(getNotesID(), castOther.getNotesID())
.isEquals();
}

public int hashCode() {
return new HashCodeBuilder().append(getNotesID()).toHashCode();
}

public String toString() {
return new ToStringBuilder(this).append("notesID", getNotesID())
.toString();
}

}

从表实体

public class NotesMsgPO implements Serializable {
private String msgID;
private String userName;
private NotesPO notes;

public NotesMsgPO() {

}


public String getMsgID() {
return this.msgID;
}


public String getUserName() {
return this.userName;
}

public NotesPO getNotes() {


return this.notes;
}

public void setMsgID(String msgID) {
this.msgID = msgID;
}


public void setUserName(String userName) {
this.userName = userName;
}



public void setNotes(NotesPO notes) {
this.notes = notes;
}

public boolean equals(Object other) {
if (!(other instanceof NotesMsgPO)) {
return false;
}
NotesMsgPO castOther = (NotesMsgPO) other;
return new EqualsBuilder()
.append(this.getMsgID(), castOther.getMsgID()).isEquals();
}

public int hashCode() {
return new HashCodeBuilder().append(this.getMsgID()).toHashCode();
}

public String toString() {
return new ToStringBuilder(this).append("notesMsgID", this.getMsgID())
.toString();
}

}

主从表保存
//主表
NotesPO notesPO = new NotesPO();
notesPO.setNotesID(UUID.randomUUID().toString());
notesPO.setNotesTitle(notesTitle);
//从表
for (int i = 0; i < arrUserID.length; i++) {
NotesMsgPO noteMsgPO = new NotesMsgPO();
noteMsgPO.setMsgID(UUID.randomUUID().toString());
noteMsgPO.setUserName(arrUserName[i]);
noteMsgPO.setNotes(notesPO);
notesPO.getNotesMsg().add(noteMsgPO);
}
//保存
session.save(notesPO);

保存时hibernate显示SQL,insert了主表,但从表本来也应该是insert却显示update,因为从表没有这条数据所以update失败
Could not synchronize database state with session
因为某种原因,我需要给主表和从表的ID赋值所以设成
<generator class="assigned" />
初用hibernate,请教大家一下原因

[解决办法]
<set name="notesMsg" table="OA_NOTESMSG"
lazy="true" inverse="false" cascade="all">
<key column="NOTESID" />
<one-to-many class="notes.po.NotesMsgPO" />
</set>

在主表配置中,把这一段删除掉试试。
[解决办法]
主表配置修改相应的部分:去掉cascade="all"
<set name="notesMsg" table="OA_NOTESMSG" 
lazy="true" inverse="false" >
<key column="NOTESID" />
<one-to-many class="notes.po.NotesMsgPO" />
</set>

从表配置修改相应部分:
<many-to-one name="notes"
class="notes.po.NotesPO" column="NOTESID"
insert="true" update="true" cascade="all"/>

Java code
        NotesPO notesPO = new NotesPO();        notesPO.setNotesID(UUID.randomUUID().toString());        notesPO.setNotesTitle(notesTitle);        // 从表        for (int i = 0; i < arrUserID.length; i++) {            NotesMsgPO noteMsgPO = new NotesMsgPO();            noteMsgPO.setMsgID(UUID.randomUUID().toString());            noteMsgPO.setUserName(arrUserName[i]);            noteMsgPO.setNotes(notesPO);            session.save(noteMsgPO);            //notesPO.getNotesMsg().add(noteMsgPO);//此行不要        }        //保存        //session.save(notesPO);//此行不要    } 

热点排行