Hibernate注解规范的文档中提供了三种方法:
1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id;
2. 将组件的属性注解为@Embeddable;
3. 将类注解为@IdClass,并将该实体中所有主键属性注解为@Id。
这里,我采用的是第三种方法——@IdClass,下面就是具体的代码,大家一块讨论一下。
首先,需要说明的是,采用@IdClass方式,需要根据所有的主键属性,建立一个主键类,该主键类包含所有的主键,而且,作为主键类,需要满足以下要求:
1. 主键类必须实现序列化接口(implements Serializable);
2. 主键类必须有默认的public无参数的构造方法;
1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id;
2. 将组件的属性注解为@Embeddable;
3. 将类注解为@IdClass,并将该实体中所有主键属性注解为@Id。
这里,我采用的是第三种方法——@IdClass,下面就是具体的代码,大家一块讨论一下。
首先,需要说明的是,采用@IdClass方式,需要根据所有的主键属性,建立一个主键类,该主键类包含所有的主键,而且,作为主键类,需要满足以下要求:
1. 主键类必须实现序列化接口(implements Serializable);
2. 主键类必须有默认的public无参数的构造方法;
3. 主键类必须覆盖equals和hashCode方法。
CREATE TABLE `bbpgbmx` (
`bbpgbid` INT(11) NOT NULL,
`pgbbh` VARCHAR(50) NOT NULL COMMENT '编号',
`mxxh` INT(11) NOT NULL COMMENT '明细序号',
`xh` VARCHAR(10) NOT NULL COMMENT '序号',
`nr` VARCHAR(100) NULL DEFAULT NULL COMMENT '内容',
`fs` INT(11) NULL DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`bbpgbid`, `pgbbh`, `mxxh`, `xh`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name = "bbpgbmx")
@JsonIgnoreProperties(ignoreUnknown=true)
public class Bbpgbmx extends ReponseModel{
@EmbeddedId
private BbpgbmxId id;
private String nr;
private Integer fs;
public Bbpgbmx() {
super();
}
public Bbpgbmx(Long bbpgbid, String pgbbh, Integer mxxh, String xh) {
this.id =new BbpgbmxId(bbpgbid,pgbbh,mxxh,xh);
}
public BbpgbmxId getId() {
return id;
}
public void setId(BbpgbmxId id) {
this.id = id;
}
public String getNr() {
return nr;
}
public void setNr(String nr) {
this.nr = nr;
}
public Integer getFs() {
return fs;
}
public void setFs(Integer fs) {
this.fs = fs;
}
}
import java.io.Serializable;
import javax.persistence.Embeddable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
*
* @Description:
Hibernate注解规范的文档中提供了三种方法:
1. 将组件类注解为@Embeddable,并将组件的属性注解为@Id;
2. 将组件的属性注解为@Embeddable;
3. 将类注解为@IdClass,并将该实体中所有主键属性注解为@Id。
这里,我采用的是第三种方法——@IdClass,下面就是具体的代码,大家一块讨论一下。
首先,需要说明的是,采用@IdClass方式,需要根据所有的主键属性,建立一个主键类,该主键类包含所有的主键,而且,作为主键类,需要满足以下要求:
1. 主键类必须实现序列化接口(implements Serializable);
2. 主键类必须有默认的public无参数的构造方法;
3. 主键类必须覆盖equals和hashCode方法。
*/
@JsonIgnoreProperties(ignoreUnknown=true)
@Embeddable //embeddable: 可嵌入的
public class BbpgbmxId implements Serializable{
private Long bbpgbid;
private String pgbbh;
private Integer mxxh;
private String xh;
/**
* 无参数的public构造方法,必须要有
*/
public BbpgbmxId() {
super();
}
public BbpgbmxId(Long bbpgbid, String pgbbh, Integer mxxh, String xh) {
this.bbpgbid = bbpgbid;
this.pgbbh = pgbbh;
this.mxxh = mxxh;
this.xh = xh;
}
public Long getBbpgbid() {
return bbpgbid;
}
public void setBbpgbid(Long bbpgbid) {
this.bbpgbid = bbpgbid;
}
public String getPgbbh() {
return pgbbh;
}
public void setPgbbh(String pgbbh) {
this.pgbbh = pgbbh;
}
public Integer getMxxh() {
return mxxh;
}
public void setMxxh(Integer mxxh) {
this.mxxh = mxxh;
}
public String getXh() {
return xh;
}
public void setXh(String xh) {
this.xh = xh;
}
/**
* 覆盖hashCode方法,必须要有
*/
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + (bbpgbid == null ? 0 : bbpgbid.hashCode());
result = PRIME * result + (pgbbh == null ? 0 : pgbbh.hashCode());
result = PRIME * result + (mxxh == null ? 0 : mxxh.hashCode());
result = PRIME * result + (xh == null ? 0 : xh.hashCode());
return result;
}
/**
* 覆盖equals方法,必须要有
*/
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
final BbpgbmxId other = (BbpgbmxId) obj;
if(bbpgbid == null){
if(other.bbpgbid != null){
return false;
}
}else if(!bbpgbid.equals(other.bbpgbid)){
return false;
}
if(pgbbh == null){
if(other.pgbbh != null){
return false;
}
}else if(!pgbbh.equals(other.pgbbh)){
return false;
}
if(mxxh == null){
if(other.mxxh != null){
return false;
}
}else if(!mxxh.equals(other.mxxh)){
return false;
}
if(xh == null){
if(other.xh != null){
return false;
}
}else if(!xh.equals(other.xh)){
return false;
}
return true;
}
}