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

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

猜你喜欢

转载自blog.csdn.net/Ldabaicai/article/details/53338285