没有主键的表如何实现Hibernate映射--复合主键

            话说从一张没有主键的表开始说起!没有想太多,直接用常规的hibernate映射,然后出了一个意料之外的异常, 请点击这里看异常!


环境:Eclipse-j2ee+Tomcate6.x+mysql5.1+hibernate3.05

           回归正题,首先建一张没有主键的表。命名为person_demo.表结构如下:

name Date     Type     Size
name varchar 20
age int 4

创建vo对象

package com.lc.demo.vo;


import java.io.Serializable;




import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;


/**
 * 复合主键类的对应类别必須实现Serializable接口
 * 以及重写equals和hashCode两个方法//自己测试如果没有重写这两个方法也没有报错
 * @author LC
 *
 */
public class Demo implements Serializable{
private String name;
private int age;

public Demo(){

}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}


public boolean equals(Object obj) {
       if(obj == this) {
           return true;
       }
       
       if(!(obj instanceof Demo)) {
           return false;
       }
       
       Demo demo = (Demo) obj;
       return new EqualsBuilder()
                .append(this.name, demo.getName())
                .append(this.age, demo.getAge())
                .isEquals();
       
   }
   
  public int hashCode() {
       return new HashCodeBuilder()
                .append(this.name)
                .append(this.age)
                .toHashCode();
   }

}

映射文件Demo.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping
>
    <class
        name="com.lc.demo.vo.Demo"
        table="person_demo" >


    <composite-id>

    <key-property name="name" column="name" type="java.lang.String">
    </key-property>

    <key-property name="age" column="age" type="java.lang.Integer">
    </key-property>

    </composite-id>
    

    </class>

</hibernate-mapping>

测试DAO

    package com.lc.demo.dao;


import java.util.List;


import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Test;


import com.lc.demo.hibernate.HibernateSessionFactory;
import com.lc.demo.vo.Demo;






public class DemoDAO  {


@Test 
public void query()
{
//原生态sql语句
String sql = "select {p.*} from person_demo p";
Session session = HibernateSessionFactory.getSession();


//addEntity方法指定了当前返回实体的别名,而且在SQL语句里使用{p.*}这样的语句,
//它的意思是向别名为p的这个对象注入所有属性值.
//用这个方法可以直接把list集合中的对象直接转换为实体Bean

List<Demo> ls = session.createSQLQuery(sql).addEntity("p",Demo.class).list();
    if(ls.size()!=0)
    {
        for(int i=0;i<ls.size();i++)
        {
            System.out.println(ls.get(i).getName());
        }
    }

}


}



你可能感兴趣的:(Hibernate,复合主键,无主键表)