【基础最重要】
环境:SSH框架下(struts2 + spring + hibernate)+oracle数据库
(在新建实体类/联合主键类时,因Oracle数据库中字段都是全部大写,使用此处字段也全部使用大写。至于使用小写会不会对其产生影响,还未测试,等以后写另一个联合主键类时再试试)
第一步:在oracle数据库中新建联合主键的表,建表语句如下:
create table mcp_fh(
aogid NUMBER not null,
reportid char(10) not null,
msn char(8),
fh NUMBER,
fh_1 NUMBER,
fh_2 NUMBER,
calcdate DATE,
constraint id_pk primary key (aogid,reportid)
);
第二步:新建联合主键类,代码如下:
需要注意的有三:必须实现Serializable接口,必须重写hashCode()和equals()方法
package com.productsys.model;
import java.io.Serializable;
import java.math.BigDecimal;
/**
*类说明
*@note 联合主键类
*@author lhf
*/
public class Fh_PK implements Serializable{
private static final long serialVersionUID = 1L;
private int AOGID;
private String REPORTID;
//省略两个字段的set/get方法
/**
* @return the serialversionuid
*/
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public boolean equals(Object o){
if(o instanceof Fh_PK) {
Fh_PK pk = (Fh_PK)o;
if(this.AOGID == pk.getAOGID() && this.REPORTID.equals(pk.getREPORTID())) {
return true;
}
}
return false;
}
@Override
public int hashCode(){
return this.REPORTID.hashCode();
}
}
第三步:在实体类中添加联合主键类,代码如下:
注意@Entity等注解来自哪个包,不要添加错了。
添加@Id注释时,有两种方式,一种是直接添加在属性上,这样的坏处是会破坏封装性;第二种是在属性的get方法上添加,推荐此种方式。
package com.productsys.model;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
/**
*类说明 javabean
*@author lhf
*
*/
@Entity
@Table(name="MCP_FH")
@IdClass(Fh_PK.class)
public class Mcpt_fh {
private int AOGID;
private String MSN;
private String REPORTID;
private float FH;
private float FH_1;
private float FH_2;
private Date CALCDATE ;
//除联合主键的get方法外,其余set/get方法均省略
/**
* @return the AOGID
*/
@Id
public int getAOGID() {
return AOGID;
}
/**
* @return the REPORTID
*/
@Id
public String getREPORTID() {
return REPORTID;
}
其他的就不多说了,最后需要注意的是,在最后写入数据到联合主键的表中时,会出现一下问题。
//正确的写法
public class PDao extends HibernateDaoSupport implements Dao {
public void save(Object object) throws HibernateException{
getHibernateTemplate().save(object);
}
当我用以下写法时,就会报错:org.hibernate.MappingException: Unknown entity: com.productsys.model.Mcp_fh
@SuppressWarnings(“unchecked”)
public String insertValue(final Mcp_fh mf ) {
getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
try {
session.save(mf);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(session !=null){
if(session.isOpen()){
session.close();
}
}
}
return null;
}
});
}
“`
调用session.save()方法或者不使用save方法,直接使用sql语句插入,均报错。但是当这张数据表不是联合主键时,这么写是没有问题的,能够正常插入到数据表中。
具体是什么原因导致的,这两种方法有什么不同,待以后研究源码才能知道(可能是两者的底层实现不一样)。现记录下这种情况,以后开发过程中需要注意。