hibernate實體繼承問題(派生類重寫基類某屬性的get方法)

目標:hibernate的全部實體類的主鍵均繼承一個基類IdEntity,基類以下:java

 /**
 * 統必定義id的entity基類.
 * @author MingDao
 */
// JPA基類標識
@MappedSuperclass
public abstract class IdEntity
{
 protected Long id;
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 public Long getId()
 {
  return id;
 }
 public void setId(Long id)
 {
  this.id = id;
 }
}

 

 這樣統必定義全部的派生類主鍵的屬性名稱、數據類型、列名映射和生成策略。web

 

在實體類的數據表主鍵字段名稱也爲「id」的狀況下,能夠派生自IdEntity。這種狀況下的派生類以下:spring

/**
 * 系統用戶實體
 */
@Entity
@Table(name = "SYS_USER")
public class User extends IdEntity
{
 private String name;
 private String account;
 private String password;
 @Column(name = "USER_NAME")
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 @Column(name = "USER_ACCOUNT")
 public String getAccount()
 {
  return account;
 }
 public void setAccount(String account)
 {
  this.account = account;
 }
 @Column(name = "USER_PASSWORD")
 public String getPassword()
 {
  return password;
 }
 public void setPassword(String password)
 {
  this.password = password;
 } 
}

 這張數據表擁有id,user_name,user_account,user_password幾個字段。
經過hibernate查詢時輸出的相似SQL爲:SELECT id,user_name,user_account,user_password FROM sys_user。

可是若是實體類的數據表主鍵字段名稱不是「id」的話,就沒有辦法使用主鍵基類了。
嘗試過在派生類中重寫基類的getId函數,並從新定義主鍵列名映射,結果會致使操做數據表時多出一個id列,並出錯。
嘗試過的實體類以下:
app

 /**
 * 客戶類型實體類
 */
@Entity
@Table(name="HHS_CLIENTTYPE")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ClientType extends IdEntity implements Serializable
{
 private static final long serialVersionUID = 4005802016130232896L;
 private String clntpCode;   //客戶類別編碼
 private String clntpName;   //客戶類別名稱
 
 @Id
 @Column(name="CLNTP_ID")
 @Override
 public Long getId()
 {
  return super.getId();
 }
 @Column(name="CLNTP_CODE")
 public String getClntpCode()
 {
  return clntpCode;
 }
 
 public void setClntpCode(String clntpCode)
 {
  this.clntpCode = clntpCode;
 }
 @Column(name="CLNTP_NAME")
 public String getClntpName()
 {
  return clntpName;
 }
 public void setClntpName(String clntpName)
 {
  this.clntpName = clntpName;
 } 
}

 

這張數據表擁有clntp_id,clntp_code,clntp_name幾個字段。clntp_id爲主鍵。
如今經過hibernate查詢時輸出的相似SQL爲:SELECT clntp_id,id,clntp_code,clntp_name FROM hhs_clientType。
多出一個id字段,致使拋出SQL異常錯誤。

由於這張表是原系統中已經存在的,因此表結構沒有辦法修改。
而且,實體類也要求須要繼承自IdEntity基類,是由於在其它地方有工具須要使用。

基類IdEntity是參考了springSide的作法,而且springSide在IdEntity中也註釋聲稱能夠在派生類中重寫getId()函數重定義id的列名映射和生成策略.ide

 

解決方案:在派生類上添加修改註解和對應列名@AttributeOverride( name="id", column = @Column(name="fld_altitude") )重寫id的註解定義. 函數

相關文章
相關標籤/搜索