您的位置:首页 > 其它

hibernate 没有id属性 怎么更新数据

2010-11-15 10:47 260 查看
今天用hibernate 查了几个表(这几个表只有 基本属性字段,没有 id )!查询数据时,还没什么问题!

就在 更新 数据时 ,因为这几个表中都没有 id ,调用 hibernate 的查询 方法时 ,提示

如下错误:
元素类型“class”的内容必须与
“(meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-
id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-
one|one-to-one|component|dynamic-
component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,
((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-
insert?,sql-update?,sql-delete?,filter*,resultset*,(query|sql-query)*)”匹
配。

最后查找后 得知是 因为 hibernate 映射文件 中没有 id 找不到指定要更新的列 ;

这里的id 也就是 这个表的一个主键 ,也就是 只要哦找到一个 “主键”即可:

那么什么是:“主键”?

主键
能够唯一表示数据表中的每个记录的【字段】或者【字段】的组合就称为主键。 一个主键是唯一识别一个表的每一记录,但这只是其作用的一部分,主键的主要作用是将记录和存放在其他表中的数据进行关联。

作用
1、主键唯一的识别每一记录;

2、主键将记录和存放在其他表中的数据进行关联。在这一点上,主键是不同表中各记录之间的简单指针。

可以通过两种方式确定主键,

一种是基于实体类的复合主键,

另一种是通过定义主键类来实现。

不管通过哪种方式,复合主键都需要实现equals方法和hashcode方法,以作为不同数据之间是别的标志。

一.

基于实体类属性的复合主键

主键由实体类中的属性组成。

user.hbm.xml:

User.hbm.xml代码

<?xmlversion=
"1.0"
?>

<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>

<hibernate-mapping>

<classname="cn.blogjava.start.TUser"
table=
"t_user"
catalog=
"sample"
>

<composite-id>

<key-propertyname="lastname"
column=
"lastname"
type=
"string"
/>

<key-propertyname="firstname"
column=
"firstname"
type=
"string"
/>

</composite-id>

<propertyname="age"
type=
"integer"
column=
"age"
/>

</class>

</hibernate-mapping>

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="cn.blogjava.start.TUser"table="t_user"catalog="sample">
<composite-id>
<key-propertyname="lastname"column="lastname"type="string"/>
<key-propertyname="firstname"column="firstname"type="string"/>
</composite-id>

<propertyname="age"type="integer"column="age"/>
</class>
</hibernate-mapping>


po:

Java代码

publicclassTUserimplementsjava.io.Serializable{

//Fields

privateIntegerage;

privateStringfirstname;

privateStringlastname;

publicIntegergetAge(){

returnage;

}

publicvoidsetAge(Integerage){

this
.age=age;

}

publicStringgetFirstname(){

returnfirstname;

}

publicvoidsetFirstname(Stringfirstname){

this
.firstname=firstname;

}

publicStringgetLastname(){

returnlastname;

}

publicvoidsetLastname(Stringlastname){

this
.lastname=lastname;

}

自己实现 equals和hashCode ........

publicclassTUserimplementsjava.io.Serializable{

//Fields

privateIntegerage;

privateStringfirstname;

privateStringlastname;

publicIntegergetAge(){
returnage;
}

publicvoidsetAge(Integerage){
this.age=age;
}

publicStringgetFirstname(){
returnfirstname;
}

publicvoidsetFirstname(Stringfirstname){
this.firstname=firstname;
}

publicStringgetLastname(){
returnlastname;
}

publicvoidsetLastname(Stringlastname){
this.lastname=lastname;
}

自己实现 equals和hashCode ........


既然 找到了 “主键” hibernate 就被欺骗了 !我们就可以用hibernate 进行操作了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐