SSH下联合主键类写法及oracle数据库中创建联合主键表的sql语句

时间:2022-04-09 01:37:09

【基础最重要】
环境: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语句插入,均报错。但是当这张数据表不是联合主键时,这么写是没有问题的,能够正常插入到数据表中。
具体是什么原因导致的,这两种方法有什么不同,待以后研究源码才能知道(可能是两者的底层实现不一样)。现记录下这种情况,以后开发过程中需要注意。