目標: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的註解定義. 函數