2013-01-09 26 views
2

我與Hibernate標註工作,我想要解決這個問題去如下:Hibernate註解 - @MappedSuperclass如何覆蓋列標識符

我需要有2個不同的@Entity類具有相同列映射但具有不同的標識符。

第一個應該使用id作爲標識符。

第二個應該使用名稱作爲標識符。

所以,我有一個抽象類,用@MappedSuperclass註解,它具有包括id和name在內的所有列,另外還有2個@Entity類,用於擴展超類並覆蓋id和name的getters。

@MappedSuperclass 
public class MappingBase { 
    protected Integer id; 
    protected String name; 

    @Column (name = "ID") 
    public void getId() { 
      return this.id; 
    } 

    @Column (name = "NAME") 
    public void getName() { 
      return this.name; 
    }    
} 

@Entity 
@Table (name = "TABLE") 
public class Entity1 extends MappingBase { 

    @Id 
    @Column (name = "ID") 
    public void getId() { 
    return this.id; 
    } 
} 

@Entity 
@Table (name = "TABLE") 
public class Entity2 extends MappingBase { 

    @Id 
    @Column (name = "NAME") 
    public void getName() { 
     return this.name; 
    } 
} 

注意:我必須在超類中有成員(id,name)。 我知道我可以將@Transient添加到ID和名稱getters中,但這意味着我必須在每個類中添加它們並且它不是一個好的設計:( 另外,下面的insertable =「false,updateable = false可以幫助,但我不明白這個是什麼意思?

請幫幫我!

+0

你有沒有辦法做到這一點,我也有同樣的情況,我需要覆蓋子類中的@Id字段 – Ysak

回答

1

你好得多定義你的基類@Embeddable和您的實現類中使用@Embedded與使用@AttributeOverride。

+0

我認爲這是創建一個組合標識符的方式,另外我無法包裝這些領域,我需要他們作爲類成員,而不是從另一個對象的一部分。 你能提供建議嗎? – kmualem

+0

@Kobim,你有沒有找到一種方法來做出改變? – MrROY

3
+0

首先它不完全是我需要的,在這個示例中,它們覆蓋了列名稱而不是標識符字段。我需要爲每個子類使用不同的@id字段。這是可能的 ? – kmualem

+0

我很懷疑這個答案,因爲它依賴於GenericID字段「id」和字段「Id」(大寫字母「i」,而不是慣用的java)之間的非常微妙的區別,因爲名稱僅僅因大小寫而不同餿主意。 – Victor

0

如果我沒有記錯的話,我簡單地定義了2個@Entity類,它們是從一個抽象的@MappedSuperclass類繼承的同一個表。超類包含id成員,每個實體類定義它自己的@Id @Column定義。它應該工作!

1

Hibernate/JPA允許我們註釋屬性或訪問器。如果我們在屬性上註冊了@Id,JPA將查找該類的所有屬性。同樣,如果我們在getter方法上有@id註釋,JPA將查找所有getter。

我們可以通過註解屬性來解決上述問題。超類和兩個子類將如下所示 -

@MappedSuperclass 
public abstract class AbstractMappingBase { 

    //properties other than id and name 

    public abstract Integer getId(); 

    public abstract String getName(); 

    //other getters and setters 

} 

@Entity 
public class Entity1 extends AbstractMappingBase { 

    @Id 
    private Integer id; 

    private String name; 

    @Override 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

@Entity 
public class Entity2 extends AbstractMappingBase { 

    private Integer id; 

    @Id 
    private String name; 

    @Override 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

此處JPA將查找屬性而不是getter。超類和它的子類之間沒有重複的屬性。所以它會正常工作。