当前位置:编程学习 > JAVA >>

hibernate注解设置复合主键

我有两个表,表ClinicForRegist和表ClinicIndex,表ClinicForRegist的主键为clinicLabel、clinicDate和clinicDate组成的复合主键,表ClinicIndex的主键为clinicLabel,两张表通过clinicLabel关联,我在用hibernate注解做映射时是这么写的:
首先为表A做了一个主键类:
public class ClinicForRegistPK implements Serializable {
private static final long serialVersionUID = 4475389606062332687L;

private String clinicLabel;
private String timeDesc;
private Date clinicDate;

public ClinicForRegistPK() {
}

public String getClinicLabel() {
return clinicLabel;
}

public void setClinicLabel(String clinicLabel) {
this.clinicLabel = clinicLabel;
}

public String getTimeDesc() {
return timeDesc;
}

public void setTimeDesc(String timeDesc) {
this.timeDesc = timeDesc;
}

public Date getClinicDate() {
return clinicDate;
}

public void setClinicDate(Date clinicDate) {
this.clinicDate = clinicDate;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((clinicDate == null) ? 0 : clinicDate.hashCode());
result = prime * result + ((clinicLabel == null) ? 0 : clinicLabel.hashCode());
result = prime * result + ((timeDesc == null) ? 0 : timeDesc.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ClinicForRegistPK other = (ClinicForRegistPK) obj;
if (clinicDate == null) {
if (other.clinicDate != null)
return false;
} else if (!clinicDate.equals(other.clinicDate))
return false;
if (clinicLabel == null) {
if (other.clinicLabel != null)
return false;
} else if (!clinicLabel.equals(other.clinicLabel))
return false;
if (timeDesc == null) {
if (other.timeDesc != null)
return false;
} else if (!timeDesc.equals(other.timeDesc))
return false;
return true;
}
}


ClinicForRegist实体类:
@Entity
@IdClass(ClinicForRegistPK.class)
@Table(name = "CLINIC_FOR_REGIST", schema = "OUTPADM")
public class ClinicForRegist implements Serializable {
private static final long serialVersionUID = 8343358305123007637L;

@Id
@Column(name = "CLINIC_DATE")
@Type(type = "java.sql.Date")
private Date clinicDate;

@Id
@ManyToOne
@JoinColumn(name = "CLINIC_LABEL")
private ClinicIndex clinicLabel;

@Id
@Column(name = "TIME_DESC")
@Type(type = "com.pap.util.UTFString")
private String timeDesc;

@Column(name = "REGIST_PRICE", scale = 2)
private double registPrice;

public Date getClinicDate() {
return clinicDate;
}

public void setClinicDate(Date clinicDate) {
this.clinicDate = clinicDate;
}

public ClinicIndex getClinicLabel() {
return clinicLabel;
}

public void setClinicLabel(ClinicIndex clinicLabel) {
this.clinicLabel = clinicLabel;
}

public String getTimeDesc() {
return timeDesc;
}

public void setTimeDesc(String timeDesc) {
this.timeDesc = timeDesc;
}

public double getRegistPrice() {
return registPrice;
}

public void setRegistPrice(double registPrice) {
this.registPrice = registPrice;
}
}

ClinicIndex实体类:
@Entity
@Table(name = "CLINIC_INDEX", schema = "OUTPADM")
public class ClinicIndex implements Serializable {
private static final long serialVersionUID = 8647964643815993643L;

@Id
@Column(name = "CLINIC_LABEL")
@Type(type = "com.pap.util.UTFString")
private String clinicLabel;

@Column(name = "DOCTOR")
@Type(type = "com.pap.util.UTFString")
private String doctorName;

@Column(name = "CLINIC_TYPE")
@Type(type = "com.pap.util.UTFString")
private String clinicType;

@ManyToOne
@JoinColumn(name = "CLINIC_DEPT")
private DeptDict dept;

public String getClinicLabel() {
return clinicLabel;
}

public void setClinicLabel(String clinicLabel) {
this.clinicLabel = clinicLabel;
}

public String getDoctorName() {
return doctorName;
}

public void setDoctorName(String doctorName) {
this.doctorName = doctorName;
}

public String getClinicType() {
return clinicType;
}

public void setClinicType(String clinicType) {
this.clinicType = clinicType;
}

public DeptDict getDept() {
return dept;
}

public void setDept(DeptDict dept) {
this.dept = dept;
}
}

不知道我这样写对不对?
当我在做数据库查询时总会报错:
 org.springframework.orm.hibernate3.HibernateSystemException: identifier of an instance of com.pap.entity.ClinicForRegist was altered from com.pap.entity.ClinicForRegistPK@a9916ed6 to com.pap.entity.ClinicForRegistPK@ea7a6b01; nested exception is org.hibernate.HibernateException: identifier of an instance of com.pap.entity.ClinicForRegist was altered from com.pap.entity.ClinicForRegistPK@a9916ed6 to com.pap.entity.ClinicForRegistPK@ea7a6b01

我的代码如下:

public class PAPWebService {
@Resource
BaseService baseService;

Logger loger = Logger.getLogger(PAPWebService.class);

public Response queryClinicRegist(int firstResult, int maxResults) {
Response response = new Response();
try {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
String[] timeDesc = null;
if (8 < hour && hour < 12) {
timeDesc = new String[] { "白天", "上午", "下午", "昼夜" };
} else if (hour > 11 && hour < 18) {
timeDesc = new String[] { "白天", "下午", "昼夜" };
} else {
timeDesc = new String[] {"昼夜" };
}
calendar.set(2003, 2, 28);
List<ClinicForRegist> list = baseService.queryClinicForRegist(new java.sql.Date(calendar.getTimeInMillis()), timeDesc, 0, 20);
if(list.size() > 0){
response.setResult("S");
response.setArrayData(list);
}else{
response.setResult("F");
response.setResult("没有查询到记录");
}

} catch (Exception e) {
e.printStackTrace();
loger.error(e);
response.setResult("F");
response.setErrorInfo(e.getMessage());
}
return response;
}
}


@Service
@Transactional(propagation = Propagation.REQUIRED)
public class BaseServiceImpl implements BaseService {
@Resource
private BaseDao baseDao;

@Override
public List<ClinicForRegist> queryClinicForRegist(java.sql.Date clinicDate, Object[] timeDesc, int firstResult, int maxResults) throws Exception {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ClinicForRegist.class);
detachedCriteria.add(Restrictions.eq("clinicDate", clinicDate));
detachedCriteria.add(Restrictions.in("timeDesc", timeDesc));
List<ClinicForRegist> list = baseDao.find(detachedCriteria, firstResult, maxResults);//运行到这句一切正常,list中也有数据
return list;//运行到这句的时候开始报如上的错误
}
}

@Repository("baseDao")
public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao{
@Override
public <T> List<T> find(DetachedCriteria detachedCriteria, int firstResult, int maxResults) throws Exception {
return getHibernateTemplate().findByCriteria(detachedCriteria, firstResult, maxResults);
}
}


问题已经说明,请高手帮忙看下,小弟感激不尽!! hibernate --------------------编程问答-------------------- 这个确实有点不好搞,
按IdClass的规定,标注了@IdClass的实体类,必须有idClass里的所有字段,并且加@Id
    @Id
    @ManyToOne
    @JoinColumn(name = "CLINIC_LABEL")
    private ClinicIndex clinicLabel; 
但是你这里用了一个类了,。这个属性,和类型跟IdClass的private String clinicLabel;
对不上了。
你在IdClass里把rivate String clinicLabel 改成private ClinicIndex clinicLabel;试试
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,