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 ........  
[java] view plaincopy
  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 ........  

 

 既然 找到了 “主鍵” hibernate 就被欺騙了 !我們就可以用hibernate 進行操作了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章