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

 

今天用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代码
  1. <?xmlversion= "1.0" ?>  
  2. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"   
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  4. <hibernate-mapping>  
  5. <classname="cn.blogjava.start.TUser" table= "t_user" catalog= "sample" >  
  6. <composite-id>  
  7. <key-propertyname="lastname" column= "lastname" type= "string" />  
  8. <key-propertyname="firstname" column= "firstname" type= "string" />  
  9. </composite-id>  
  10.   
  11. <propertyname="age" type= "integer" column= "age" />  
  12. </class>  
  13. </hibernate-mapping>  

 
po:

Java代码
  1. publicclassTUserimplementsjava.io.Serializable{  
  2.   
  3. //Fields   
  4.   
  5. privateIntegerage;  
  6.   
  7. privateStringfirstname;  
  8.   
  9. privateStringlastname;  
  10.   
  11. publicIntegergetAge(){  
  12. returnage;  
  13. }  
  14.   
  15. publicvoidsetAge(Integerage){  
  16. this .age=age;  
  17. }  
  18.   
  19. publicStringgetFirstname(){  
  20. returnfirstname;  
  21. }  
  22.   
  23. publicvoidsetFirstname(Stringfirstname){  
  24. this .firstname=firstname;  
  25. }  
  26.   
  27. publicStringgetLastname(){  
  28. returnlastname;  
  29. }  
  30.   
  31. publicvoidsetLastname(Stringlastname){  
  32. this .lastname=lastname;  
  33. }  
  34.   
  35. 自己实现 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 进行操作了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值