Hibernate学习之---------联合主键的xml实现

在学习hibernate时,联合主键有两种实现方式:

            1.xml实现;

            2.注解实现.

在定义联合主键时,我们需要为主键定义一个类,同时在包含该主键的类上定义该主键累的对象,需要说明的是

该联合主键类必须实现Serializable接口,不然有可能在对象缓存时会出现问题。

下面我们来举例:

    此处又一学生类:

  

 

package ly.suse.model;

//学生类
public class Student {
        //定义主键对象
	private StudentPK pk;
	
	public StudentPK getPk() {
		return pk;
	}

	public void setPk(StudentPK pk) {
		this.pk = pk;
	}

	
	private int age;


	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

该学生类中的主键即为StudentPK。

 

然后来看主键类的实现:

package ly.suse.model;

import java.io.Serializable;
//主键类,用联合主键记得重写equals and hashcode
public class StudentPK implements Serializable {

	private int id;
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
        //重写equals方法
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof StudentPK){
			StudentPK pk = (StudentPK) obj;
			if(this.id == pk.getId()&&this.name.equals(pk.getName())){
				return true;
			}
		}
		return false;
	}
        //重写hashcode方法	
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
}

 然后就是在Student.hbm.xml文件中配置;

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.hibernate.tutorial.domain">
	<class name="ly.suse.model.Student" table="student">
                 <!--使用composite-id元素来申明联合主键,name指明该主键在该类中的属性名称,class指明该主键的类-->
		<composite-id name="pk" class="ly.suse.model.StudentPK">
                      <!--key-property指明该主键类所拥有的属性,name指明该属性名称 -->
			<key-property name="id" />
			<key-property name="name" />
		</composite-id>
		<property name="age"></property>
	</class>
</hibernate-mapping>

 这样我们就写好了联合主键的xml实现方式:

这里我们测试一下写了一个测试类:

import ly.suse.model.Student;
import ly.suse.model.StudentPK;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class StudentTest {

	public static void main(String[] args) {
		//定义主键类对象
		StudentPK pk = new StudentPK();
		//定义Student对象
		Student s = new Student();
		//设置主键属性
		pk.setId(3);
		pk.setName("zhangsan");
		//将该主键设置到s对象中
		s.setPk(pk);
		s.setAge(1);
		//获取hibernate配置对象
		Configuration cfg = new Configuration();
		//创建hibernate SessionFactory对象
		SessionFactory sf = cfg.configure().buildSessionFactory();
		//用SessionFactory创建Session对象
		Session session = sf.openSession();
		//开始事务申明
		Transaction tx = session.beginTransaction();
		//保存s对象
		session.save(s);
		//提交事务
		tx.commit();
		//关闭session关闭资源
		session.close();
		//关闭SessionFactory
		sf.close();
	}
}

 

测试完全通过,只不过要注意这里我没有student这张表,但在hibernate配置是是配置为update,主键在这里没有单独生成一张表哦!

 

 +----+----------+------+
| id | name     | age  |
+----+----------+------+
|  3 | zhangsan |    1 |
+----+----------+------+

你可能感兴趣的:(Hibernate)