本人初学hibernate,希望大家多多指教!
我假设person和card的多对一的关系(实际这两者的关系不是多对一)
他们对应的映射文件是:
person.hbm.xml
<!----><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>
<!----><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 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();
。。。。。。。
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
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
---- 表的结构
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
),
KEYcard_id
(card_id
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;
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; }
}
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;
}
}
晕,排版不象我想象的,反而搞乱了
区别是,原文用的hibernate3
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
lz用的hibernate2
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
楼主你没有在数据库设置外键约束关系
[code="java"]
[/code]
你去掉cascade="all,并不代表没有级联了,当你不写时他有个默认的级联cascade="save_update",你不想要级联可以指明cascade="none";
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
出现这样的异常一般是更新Id不存在(在数据库中没有),
我用hibernate3测试了下,如果不写cascade的话,会报错,因为你的表定义中用了not null,
而card表不会被提前创建出来,加了cascade之后存储数据正常,先insert card表再insert person表
[code="java"]
Hibernate: insert into CARD values ( )
Hibernate: insert into PERSON (CARD_ID) values (?)
[/code]
identity属性只能在支持auto_increment的数据库时使用,意思是id由数据库控制自增长,但是象oracle就需要用到sequence,所以一般使用native属性比较安全,移植性也比较好,hibernate会自己根据数据库类型来选择怎么生成id,不过看lz的表一定有可能是mysql,这个属性是有效的
以上都是基于hibernate3测试的结果,手头没有hibernate2的jar包,所以没有测试
啊,对了,我刚才看了下lz说的原文,在hibernate映射文件头使用的和我测试用的一样,都是
[code="java"]
http://hibernate.sourceforge.net/hibernate-mapping-[color=red]3.0[/color].dtd
[/code]
而lz的映射文件头为
[code="java"]
http://hibernate.sourceforge.net/hibernate-mapping-[color=red]2.0[/color].dtd
[/code]
有可能是版本问题,至于到底hibernate2到3之间改了什么,我就不清楚了,抱歉哈