hibernate主表保存从表保存不了

newc_k 2011-10-10 01:27:34
主表配置
<?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,请教大家一下原因
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
newc_k 2011-10-11
  • 打赏
  • 举报
回复
顶起来,希望高手帮帮忙
newc_k 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 trocp 的回复:]

上例中
注意代码中增加了一行
session.save(noteMsgPO);
[/Quote]

不行
Hibernate: insert into OA_NOTESMSG (USERNAME, NOTESID, MSGID) values (?, ?, ?)
Hibernate: insert into OA_NOTESMSG (USERNAME, NOTESID, MSGID) values (?, ?, ?)
Hibernate: update OA_NOTES set NOTESTITLE=? where NOTESID=?
net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)
newc_k 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 trocp 的回复:]

主表配置修改相应的部分:去掉cascade="all"
<set name="notesMsg" table="OA_NOTESMSG"
lazy="true" inverse="false" >
<key column="NOTESID" />
<one-to-many class="notes.po.NotesMsgPO" />
</set>

从表配置修改相应部分:
<m……
[/Quote]

还没有试,不过不能保存主表,然后自动保存从表?这样很奇怪啊,那我建那些关系有什么用,不如主表、从表单独保存好了。
发果是多张从表,不得每个从表都要保存?
oO临时工Oo 2011-10-10
  • 打赏
  • 举报
回复
上例中
注意代码中增加了一行
session.save(noteMsgPO);
oO临时工Oo 2011-10-10
  • 打赏
  • 举报
回复
主表配置修改相应的部分:去掉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"/>

		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);//此行不要
}



im110 2011-10-10
  • 打赏
  • 举报
回复
或者,你把 主表中 inverse="false" 改成 inverse="true"试试。
从表改成inverse="false"
im110 2011-10-10
  • 打赏
  • 举报
回复
<set name="notesMsg" table="OA_NOTESMSG"
lazy="true" inverse="false" cascade="all">
<key column="NOTESID" />
<one-to-many class="notes.po.NotesMsgPO" />
</set>

在主表配置中,把这一段删除掉试试。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧