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>
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 ........
既然 找到了 “主键” hibernate 就被欺骗了 !我们就可以用hibernate 进行操作了
就在 更新 数据时 ,因为这几个表中都没有 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 进行操作了
相关文章推荐
- hibernate 没有id属性 怎么更新数据
- 建一张没有id属性的表,hibernate的映射文件要怎么写
- hibernate persist update 方法没有正常工作(不保存数据,不更新数据)
- 映射Hibernate如果指定了column的相关属性,则name属性必需.id如果没有配置name与属性对应,则取不出id
- SpringMVC-Hibernate关于数据更新没有持久化的问题
- 请问一下,我要向一个表插入数据,根据ID,重复的更新,没有的插入,不使用COUNT后判断,能做到吗?
- 插入数据库提示Hibernate: select max(id) from ....然后数据库没有插入数据
- hibernate怎么得到插入数据的主键 或者自动增值的id
- hibernate怎么得到插入数据的主键 或者自动增值的id
- linux下两个目录的数据是一致的,没有做链接,怎么实现的?
- 如何在PB数据窗口中设置数据窗口的更新属性
- 怎么查询在A表中不存在的B表的数据(id+bm两个条件)
- struts2与Hibernate的整合,实现数据库后台数据更新
- hibernate登录过程中怎么传用户名(name)和密码(password)然后查到用户的ID并返回到页面上
- PHP框架 Laravel Eloquent ORM 批量插入数据 && 批量更新目前没有
- 两个没有直接关系的activity之间怎么进行数据传递即application的作用及用法
- Hibernate入门之更新,删除数据
- flex tree 怎么在java后台组合成合适的数据,我使用的是flex spring hibernate
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;