聯合主鍵用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)
@Column —— 注解聲明了屬性到列的映射。該注解有如下的屬性
name 可選,列名(默認值是屬性名)
unique 可選,是否在該列上設置唯一約束(默認值false)
nullable 可選,是否設置該列的值可以為空(默認值false)
insertable 可選,該列是否作為生成的insert語句中的一個列(默認值true)
updatable 可選,該列是否作為生成的update語句中的一個列(默認值true)
columnDefinition 可選,為這個特定列覆蓋sql ddl片段(這可能導致無法在不同數據庫間移植)
table 可選,定義對應的表(默認為主表)
length 可選,列長度(默認值255)
precision 可選,列十進制精度(decimal precision)(默認值0)
scale 可選,如果列十進制數值范圍(decimal scale)可用,在此設置(默認值0)
precision屬性和scale屬性表示精度時,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數。
@Digits(integer=12, fraction=3)
檢查此值是否是一個數字,並且這個數字的整數部分不超過integer定義的位數, 和小數部分不超過fraction 定義的位數.[對應的數據庫表字段會被設置精度(precision)和准度(scale)]
檢查所給的字符串是否符合email地址的格式
@Future
檢查給定的日期是否比現在晚
@Past
檢查標注對象中的值表示的日期比當前早.
@Length(min=, max=)
檢查該字符串的長度是否在min 和 max規定的范圍內.[對應的數據庫表字段的長度會被設置成約束中定義的最大值]
@Max
檢查該值是否小於或等於約束條件中指定的最大值.[會給對應的數據庫表字段添加一個check的約束條件]
@NotNull
檢查該值不為null[對應的表字段不允許為null]
@NotBlank
檢查該字符串不為null,並且不是空字符串. 本約束和下面的@NotEmpty的不同之處在於,本約束只能被用在字符串類型上,並且會忽略字符串尾部的空
@NotEmpty
檢查該值不為null同時也不為空.
@Null
檢查該值應該為null.
@Range(min=, max=)
檢查該值是否在[min, max)之間
@Size(min=, max=)
檢查該值的size是否在[min, max)之間.[對應的數據庫表字段的長度會被設置成約束中定義的最大值.]
@URL(protocol=, host=, port=)
判斷該值是否是一個有效的URL, 如果給出了約束中的protocol, host 或 port 參數的話,那個被校驗的值需要和其匹配.
@Valid
遞歸得對關聯對象進行校驗, 如果關聯對象是個集合或者數組, 那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.
@Transient
表示該屬性並非是一個到數據庫表的字段的映射,ORM框架將忽略該屬性.
被注解成 @Transient 的 getter 方法或屬性,將不會被持久化,hibernate 會忽略這些字段和屬性。
如果一個屬性並非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic
@Basic
所有沒有定義注解的屬性,等價於在其上面添加了 @Basic 注解。通過 @Basic注解可以聲明屬性的獲取策略 ( fetch strategy ),默認的是即時獲取(early fetch),這里又討論到了
延遲關聯獲取和延遲屬性獲取,通常不需要對簡單屬性設置延遲獲取,如需要定義@Basic(fetch=FetchType.LAZY)
通過@Basic注解可以聲明屬性的獲取策略(lazy與否),默認的是即時獲取(early fetch),這里又討論到了
延遲關聯獲取和延遲屬性獲取,通常不需要對簡單屬性設置延遲獲取,如需要定義@Basic(fetch=FetchType.LAZY)
@OrderBy(value = "id ASC")
指明加載OrderItem 時按id 的升序排序
hierbate search注解【基於lucene】
@DateBridge(resolution = Resolution.SECOND)
因為lucene有些版本現在貌似只能對字符串進行索引【新的版本貌似支持數值索引】,所有date類型需要轉換成 string,Resolution.SECOND就是解析成秒格式的字符串,有以下參數
Resolution.YEAR: yyyy
Resolution.MONTH: yyyyMM
Resolution.DAY: yyyyMMdd
Resolution.HOUR: yyyyMMddHH
Resolution.MINUTE: yyyyMMddHHmm
Resolution.SECOND: yyyyMMddHHmmss
Resolution.MILLISECOND: yyyyMMddHHmmssSSS
@MappedSuperclass
基於代碼復用和模型分離的思想,在項目開發中使用JPA的@MappedSuperclass注解將實體類的多個共同屬性封裝到非實體類中,適合父類和子類的關系
0、 @MappedSuperclass注解只能標注在類上
1、標注為@MappedSuperclass的類將不是一個完整的實體類,他不會映射到數據庫表,但是他的屬性都將映射到其子類的數據庫字段中。
2、標注為@MappedSuperclass的類不能再標注@Entity或@Table注解,也無需實現序列化接口。
3、如果一個標注為@MappedSuperclass的類繼承了另外一個實體類或者另外一個同樣標注了@MappedSuperclass的類的話,他將可以使用@AttributeOverride或@AttributeOverrides注解重定義其父類(無論是否是實體類)的屬性映射到數據庫表中的字段。比如可以重定義字段名或長度等屬性,使用@AttributeOverride中的子屬性@Column進行具體的定義。
注意:對於其父類中標注@Lob注解的屬性將不能重載,並且@AttributeOverride里的@Column設置都將不起作用。JPA規范中對@Lob注解並沒有說明不能同時標注@Column注解,但是在實際使用中Hibernate JPA不支持這種標注方式。
4、標注為@MappedSuperclass的類其屬性最好設置為protected或default類型的,以保證其同一個包下的子類可以直接調用它的屬性。
public class BmRoRolerightmatrixPK implements Serializable{ private static final long serialVersionUID = 1L; private Long actId;//功能操作ID private Long roleId;//角色ID @Column(name = "ACT_ID",unique = false,nullable = true,length = 10) public Long getActId() { return actId; } public void setActId(Long actId) { this.actId = actId; } @Column(name = "ROLE_ID",unique = false,nullable = true,length = 10) public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } }
@Entity @IdClass(BmRoRolerightmatrixPK.class) @Table(name = "BM_RO_ROLERIGHTMATRIX") public class BmRoRolerightmatrix implements Serializable{ private static final long serialVersionUID = 1L; public BmRoRolerightmatrix(){} //屬性 private Long actId;//功能操作ID private Long roleId;//角色ID @Id public Long getActId() { return this.actId; } @Id public Long getRoleId() { return this.roleId; } ...
public class WalletBalanceId implements Serializable{ /** * */ private static final long serialVersionUID = -6967634249077311858L; /*** * CID 客戶號 */ @ManyToOne @JoinColumn(name = "CID") private Customer customer; /*** * 理財賬號 */ @Column(name = "ACCT_NO") private String acctNo; public WalletBalanceId() { super(); } public WalletBalanceId(Customer customer, String acctNo) { super(); this.customer = customer; this.acctNo = acctNo; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public String getAcctNo() { return acctNo; } public void setAcctNo(String acctNo) { this.acctNo = acctNo; } @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
@Entity @Table(name = "T_WALLET_BALANCE") @IdClass(WalletBalanceId.class) public class WalletBalance implements Serializable { /** * */ private static final long serialVersionUID = -4041192003429561466L; /*** * CID(主鍵) 客戶號 */ @Id @ManyToOne @JoinColumn(name = "CID") private Customer customer; /*** * 理財賬號 */ @Id @Column(name = "ACCT_NO") private String acctNo; /*** * 總金額 */ @Column(name = "TOTAL_AMT") private BigDecimal totalAmt; /*** * 資金狀態 */ @Column(name = "FUND_STATE") private String fundState; /*** * 更新日期 */ @Column(name = "UPD_DATE") private Date updDate; public WalletBalance() { super(); } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public String getAcctNo() { return acctNo; } public void setAcctNo(String acctNo) { this.acctNo = acctNo; } public BigDecimal getTotalAmt() { return totalAmt; } public void setTotalAmt(BigDecimal totalAmt) { this.totalAmt = totalAmt; } public String getFundState() { return fundState; } public void setFundState(String fundState) { this.fundState = fundState; } public Date getUpdDate() { return updDate; } public void setUpdDate(Date updDate) { this.updDate = updDate; } @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
public class CplsPK extends BaseObject { public String getCpzxh() { return cpzxh; } public void setCpzxh(String cpzxh) { this.cpzxh = cpzxh; } public String getXtgzh() { return xtgzh; } public void setXtgzh(String xtgzh) { this.xtgzh = xtgzh; } public String getDqdh() { return dqdh; } public void setDqdh(String dqdh) { this.dqdh = dqdh; } private String cpzxh; private String xtgzh; private String dqdh; }
@Entity @Table(name = "sim_cpls",catalog="yyptsim") @IdClass(com.yyptsim.dbmap.CplsPK.class) public class Cpls extends BaseObject{ private String cpzxh; private String xtgzh; private String dqdh; private String syckh;//索引參考號8位長度,用於沖正用 private String jygy; private String gylsh; private String qsrq; private String transtime; private String sllwhbh; private String sljgbsm; private String jsjgbsm; private String jydm; private String sllwhjydm; private String msgid; private String zhdh; private String jdbj; private double zhye; private String xym; private double jyje; private String jlzt; public Cpls(String cpzxh,String xtgzh,String dqdh,String syckh,String jygy,String gylsh,String qsrq,String transtime,String sllwhbh,String sljgbsm,String jsjgbsm,String jydm,String sllwhjydm,String msgid,String zhdh,String jdbj,double zhye,String xym,double jyje,String jlzt) { this.cpzxh=cpzxh; this.xtgzh=xtgzh; this.dqdh=dqdh; this.syckh=syckh; this.jygy=jygy; this.gylsh=gylsh; this.qsrq=qsrq; this.transtime=transtime; this.sllwhbh=sllwhbh; this.sljgbsm=sljgbsm; this.jsjgbsm=jsjgbsm; this.jydm=jydm; this.sllwhjydm=sllwhjydm; this.msgid=msgid; this.zhdh=zhdh; this.jdbj=jdbj; this.zhye=zhye; this.xym=xym; this.jyje=jyje; this.jlzt=jlzt; } public Cpls() { } public void setCpzxh(String cpzxh) { this.cpzxh = cpzxh; } @Id @Column(name="cpzxh") public String getCpzxh() { return cpzxh; } @Id @Column(name="xtgzh") public String getXtgzh() { return xtgzh; } public void setXtgzh(String xtgzh) { this.xtgzh = xtgzh; } public void setDqdh(String dqdh) { this.dqdh = dqdh; } @Id @Column(name="dqdh") public String getDqdh() { return dqdh; } public void setSyckh(String syckh) { this.syckh = syckh; } @Basic @Column(name="syckh") public String getsyckh() { return syckh; } @Basic @Column(name="jygy") public String getJygy() { return jygy; } public void setJygy(String jygy) { this.jygy = jygy; } @Basic @Column(name="gylsh") public String getGylsh() { return gylsh; } public void setGylsh(String gylsh) { this.gylsh = gylsh; } public void setQsrq(String qsrq) { this.qsrq = qsrq; } @Basic @Column(name="qsrq") public String getQsrq() { return qsrq; } public void setTranstime(String transtime) { this.transtime = transtime; } @Basic @Column(name="transtime") public String getTranstime() { return transtime; } @Basic @Column(name="sllwhbh") public String getSllwhbh() { return sllwhbh; } public void setSllwhbh(String sllwhbh) { this.sllwhbh = sllwhbh; } @Basic @Column(name="sljgbsm") public String getSljgbsm() { return sljgbsm; } public void setSljgbsm(String sljgbsm) { this.sljgbsm = sljgbsm; } public void setJsjgbsm(String jsjgbsm) { this.jsjgbsm = jsjgbsm; } @Basic @Column(name="jsjgbsm") public String getJsjgbsm() { return jsjgbsm; } public void setJydm(String jydm) { this.jydm = jydm; } @Basic @Column(name="jydm") public String getJydm() { return jydm; } public void setMsgid(String msgid) { this.msgid = msgid; } @Basic @Column(name="msgid") public String getMsgid() { return msgid; } @Basic @Column(name="sllwhjydm") public String getSllwhjydm() { return sllwhjydm; } public void setSllwhjydm(String sllwhjydm) { this.sllwhjydm = sllwhjydm; } public void setZhdh(String zhdh) { this.zhdh = zhdh; } @Basic @Column(name="zhdh") public String getZhdh() { return zhdh; } @Basic @Column(name="jdbj") public String getJdbj() { return jdbj; } public void setJdbj(String jdbj) { this.jdbj = jdbj; } @Basic @Column(name="zhye") public double getZhye() { return zhye; } public void setZhye(double zhye) { this.zhye = zhye; } public void setXym(String xym) { this.xym = xym; } @Basic @Column(name="xym") public String getXym() { return xym; } @Basic @Column(name="jyje") public double getJyje() { return jyje; } public void setJyje(double jyje) { this.jyje = jyje; } public void setJlzt(String jlzt) { this.jlzt = jlzt; } @Basic @Column(name="jlzt") public String getJlzt() { return jlzt; } }