Hibernate註解對映聯合主鍵的三種主要方式
聯合主鍵用Hibernate註解對映方式主要有三種:
第一、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,再將該類註解為@Embeddable,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用註解為@Id
第二、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並重寫equals和hascode,最後在主類中(該類不包含聯合主鍵類中的欄位)儲存該聯合主鍵類的一個引用,並生成set和get方法,並將該引用註解為@EmbeddedId
第三、將聯合主鍵的欄位單獨放在一個類中,該類需要實現java.io.Serializable介面並要重寫equals和hashcode.最後在主類中(該類包含聯合主鍵類中的欄位)將聯合主鍵欄位都註解為@Id,並在該類上方將上這樣的註解:@IdClass(聯合主鍵類.class)
使用方式:
1、model類:
- @Entity
- @Table(name="JLEE01")
- public class Jlee01 implements Serializable{
-
private static final long serialVersionUID = 3524215936351012384L;
- private String address ;
- private int age ;
- private String email ;
- private String phone ;
- @Id
- private JleeKey01 jleeKey ;
- @Embeddable
- public class JleeKey01 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 JleeKey01){
- JleeKey01 key = (JleeKey01)o ;
- if(this.id == key.getId() && this.name.equals(key.getName())){
- return true ;
- }
- }
- return false ;
- }
- @Override
- public int hashCode() {
- return this.name.hashCode();
- }
- }
- @Entity
- @Table(name="JLEE02")
- public class Jlee02 {
- private String address ;
- private int age ;
- private String email ;
- private String phone ;
- @EmbeddedId
- private JleeKey02 jleeKey ;
主鍵類:JleeKey02.java
普通java類即可。
3、model類:- @Entity
- @Table(name="JLEE03")
- @IdClass(JleeKey03.class)
- public class Jlee03 {
- @Id
- private long id ;
- @Id
- private String name ;
普通java類。
主鍵類都需要實現重寫equals和hascode方法,至於是否需要實現implements Serializable介面,測試了下,貌似可以不需要。
前端如果用easyui的 話,
需要這樣寫:
{field:'joinKey.statistic_id',title:'編號',width:80,sortable:true,align:'center',
formatter:function(value,rowData,rowIndex){
return rowData.joinKey.statistic_id;
}},
{field:'joinKey.month',title:'時間(單位月)',width:200,sortable:true,align:'center',
formatter:function(value,rowData,rowIndex){
return rowData.joinKey.month;
}}
joinKey為主鍵類,statistic_id、month為聯合主鍵的欄位。