hibernate中单向多对一的关联疑惑(管理员勿将帖子转到问答,那里不好交流)...

本人初学hibernate,希望大家多多指教!
我假设person和card的多对一的关系(实际这两者的关系不是多对一)
他们对应的映射文件是:
[b]person.hbm.xml[/b]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping schema="hibernatequickuse">
<class name="mypack.person" table="person">
<id name="id" column="id" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="name" column="name" type="java.lang.String" not-null="true"></property>
<many-to-one name="mycard" column="card_id" class="mypack.Card" cascade="all"></many-to-one>
</class>
</hibernate-mapping>

[b]Card.hbm.xml[/b]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="mypack.Card" table="card">
<id name="id" column="ID" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="name" column="NAME" type="java.lang.String" not-null="true"></property>
</class>
</hibernate-mapping>


假设当我们先把many-to-one中的cascade属性值去掉,改为:
<many-to-one name="mycard" column="card_id"  class="mypack.Card"  ></many-to-one>

然后执行如下代码:

person p=new person();
p.setName("jack01");
Card c=new Card();
c.setName("card0031");
p.setMycard(c);
Session session=null;
Transaction tran=null;
try{
session=factory.openSession();
tran=session.beginTransaction();
session.save(p);//为什么是update,而不是Insert
tran.commit();
。。。。。。。



执行结果本来应该会报一个异常,因为只持久化了person对象。而card是临时对象,所以当hibernate自动清理缓存中的持久化对象时会发现p引用了c临时对象,而在person表中对应的card_id字段值为0,这说明person持久化对象的状态和数据库的记录不一致,所以应该会抛出异常!但是它却并没有抛出异常,
而是插入了一条person记录,其card_id=0这是为什么???
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)

当我把cascade="all"加上去之后,本来这时应该是先插入card记录,然后插入Person记录。但结果却是:

Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?

而且抛出异常,表示无法更新!这又是为什么????????

Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

[b]表结构如下:[/b]


--
-- 表的结构 `card`
--

CREATE TABLE `card` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;


CREATE TABLE `person` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(32) collate latin1_general_ci NOT NULL,
`card_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `card_id` (`card_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;


[b]POJO如下:[/b]
[b]person[/b]

package mypack;
public class person implements java.io.Serializable{
private int id;
private String name;
private Card mycard;

public person(){

}
private void setId(int id){
this.id=id;
}
public void setName(String name){
this.name=name;
}
public void setMycard(Card mycard){
this.mycard=mycard;
}
public int getId(){
return this.id;
}
public String getName(){
return this.name;
}
public Card getMycard(){
return this.mycard;
}

}


[b]Card[/b]

package mypack;

public class Card {
private int id;
private String name;

public Card(){

}
public void setId(int id){
this.id=id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public int getId(){
return this.id;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值