程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Hibernate注解映射聯合主鍵的三種主要方式,hibernate主鍵

Hibernate注解映射聯合主鍵的三種主要方式,hibernate主鍵

編輯:JAVA綜合教程

Hibernate注解映射聯合主鍵的三種主要方式,hibernate主鍵


  今天在做項目的時候,一個中間表沒有主鍵,所有在創建實體的時候也未加組件,結果報以下錯誤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateSessionFactory' defined in class path resource [spring-config/ac-cif-srv-config.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: XXX

  可以看出,其指出某一類是未指定標識符的實體,其主要原因是hibernate在進行掃描實體的時候,為發現其主鍵標識。所以就在其類上添加主鍵標識。因為我的這個類比較特殊,需要添加聯合主鍵。

  聯合主鍵用Hibernate注解映射方式主要有三種:

  一、將聯合主鍵的字段單獨放在一個類中,該類需要實現java.io.Serializable接口並重寫equals和hascode,再將該類注解為@Embeddable,最後在主類中(該類不包含聯合主鍵類中的字段)保存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用注解為@Id

@Entity  
@Table(name="Test01")  
public class Test01 implements Serializable{  
  
    private static final long serialVersionUID = 3524215936351012384L;  
    private String address ;  
    private int age ;  
    private String email ;  
    private String phone ;  
    @Id
    private TestKey01 testKey ;
}

  主鍵類:

@Embeddable  
public class Testkey01  implements Serializable{  
  
    private static final long serialVersionUID = -3304319243957837925L;  
    private long id ;  
    private String name ;  
    /** 
     * @return the id 
     */  
    public long getId() {  
        return id;  
    }  
    /** 
     * @param id the id to set 
     */  
    public void setId(long id) {  
        this.id = id;  
    }  
    /** 
     * @return the name 
     */  
    public String getName() {  
        return name;  
    }  
    /** 
     * @param name the name to set 
     */  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public boolean equals(Object o) {  
        if(o instanceof Testkey0101){  
            Testkey01 key = (TestKey01)o ;  
            if(this.id == key.getId() && this.name.equals(key.getName())){  
                return true ;  
            }  
        }  
        return false ;  
    }  
      
    @Override  
    public int hashCode() {  
        return this.name.hashCode();  
    }  
      
}  

  二、將聯合主鍵的字段單獨放在一個類中,該類需要實現java.io.Serializable接口並重寫equals和hascode,最後在主類中(該類不包含聯合主鍵類中的字段)保存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用注解為@EmbeddedId

@Entity  
@Table(name="Test02")  
public class Test02 {  
  
    private String address ;  
    private int age ;  
    private String email ;  
    private String phone ;  
    @EmbeddedId
    private TestKey02 testKey ;
}

  Testkey02為普通Java類即可。

  三、將聯合主鍵的字段單獨放在一個類中,該類需要實現java.io.Serializable接口並要重寫equals和hashcode.最後在主類中(該類包含聯合主鍵類中的字段)將聯合主鍵字段都注解為@Id,並在該類上方將上這樣的注解:@IdClass(聯合主鍵類.class)

@Entity  
@Table(name="Test03")  
@IdClass(TestKey03.class)  
public class Test03 {  
    @Id
    private long id ;
    @Id  
    private String name ; 
}

  Testkey03為普通Java類即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved