今天用hibernate 查了幾個表(這幾個表只有 基本屬性字段,沒有 id )!查詢數據時,還沒什麼問題!
就在 更新 數據時 ,因爲這幾個表中都沒有 id ,調用 hibernate 的查詢 方法時 ,提示
最後查找後 得知是 因爲 hibernate 映射文件 中沒有 id 找不到指定要更新的列 ;
這裏的id 也就是 這個表的一個主鍵 ,也就是 只要哦找到一個 “主鍵”即可:
那麼什麼是:“主鍵”?
2、主鍵將記錄和存放在其他表中的數據進行關聯。在這一點上,主鍵是不同表中各記錄之間的簡單指針。
可以通過兩種方式確定主鍵,
一種是基於實體類的複合主鍵,
另一種是通過定義主鍵類來實現。
不管通過哪種方式,複合主鍵都需要實現equals方法和hashcode方法,以作爲不同數據之間是別的標誌。
一.
基於實體類屬性的複合主鍵
主鍵由實體類中的屬性組成。
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:
- 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 進行操作了