IT技术互动交流平台

hibernate联合主键

来源:IT165收集  发布日期:2016-03-03 21:28:01

1.假设id和name是联合主键,应用面向对象的思想,单独设计一个类作为主键类。

Student.java

 

package com.bjsxt.hibernate;

public class Student {
	
	private StudentPK pk;
	
	private int age;
	private String sex;
	private boolean good;
	public boolean isGood() {
		return good;
	}
	public void setGood(boolean good) {
		this.good = good;
	}
	/*public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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 String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public StudentPK getPk() {
		return pk;
	}
	public void setPk(StudentPK pk) {
		this.pk = pk;
	}	
	
}

2.StudentPk.java

 

 

package com.bjsxt.hibernate;

public class StudentPK implements java.io.Serializable{
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	//保证唯一性,重写equals和hashCode
	
	@Override
	public boolean equals(Object o) {
		if(o instanceof StudentPK) {
			StudentPK pk = (StudentPK)o;
			if(this.id == pk.getId() && this.name.equals(pk.getName())) {
				return true;
			}
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
}

3.HibernateIDTest.java

 

 

package com.bjsxt.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateIDTest {
	private static SessionFactory sessionFactory;
	
	@BeforeClass
	public static void beforeClass() {
			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	}
	@AfterClass
	public static void afterClass() {
		sessionFactory.close();
	}
	
	@Test
	public void testStudentSave() {
		StudentPK pk = new StudentPK();
		pk.setId(1);
		pk.setName("zhangsan");
		Student s = new Student();
		s.setPk(pk);
		s.setAge(8);
		
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.save(s);
		session.getTransaction().commit();
	}
	
	@Test
	public void testTeacherSave() {
	
		Teacher t = new Teacher();
		t.setId(1);
		t.setName("t1");
		t.setTitle("middle");
		t.setBirthDate(new Date());
		
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
	}
	
	public static void main(String[] args) {
		beforeClass();
	}
}

4.Student.hbm.xml

 

 

<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Student">			
		<composite-id name="pk" class="com.bjsxt.hibernate.StudentPK">
			<key-property name="id"></key-property>
			<key-property name="name"></key-property>
		</composite-id>		
		<property name="age" />
		<property name="sex" />
		<property name="good" type="yes_no"></property>
    </class>	
</hibernate-mapping>

Annotation版本的联合主键

 

 

下面是定义组合主键的几种语法:

  • 将组件类注解为@Embeddable,并将组件的属性注解为@Id
  • 将组件的属性注解为@EmbeddedId
  • 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id TeacherPK.java

     

    package com.bjsxt.hibernate;
    
    import javax.persistence.Embeddable;
    
    
    public class TeacherPK implements java.io.Serializable{
    	private int id;
    	private String name;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@Override
    	public boolean equals(Object o) {
    		if(o instanceof TeacherPK) {
    			TeacherPK pk = (TeacherPK)o;
    			if(this.id == pk.getId() && this.name.equals(pk.getName())) {
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	@Override
    	public int hashCode() {
    		return this.name.hashCode();
    	}
    }
    

    Teacher.java

     

     

    package com.bjsxt.hibernate;
    
    import java.util.Date;
    
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.EnumType;
    import javax.persistence.Enumerated;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.IdClass;
    import javax.persistence.SequenceGenerator;
    
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.persistence.Transient;
    
    @Entity
    @javax.persistence.TableGenerator(
    	    name="Teacher_GEN",
    	    table="GENERATOR_TABLE",
    	    pkColumnName = "pk_key",
    	    valueColumnName = "pk_value",
    	    pkColumnValue="Teacher",
    	    allocationSize=1
    	)
    
    @SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")
    @IdClass(TeacherPK.class)
    public class Teacher {
    	//private TeacherPK pk;
    	private int id;
    	private String name;
    	private String title; 
    	private String yourWifeName;
    	private Date birthDate;
    	private boolean good;
    	private Gender gender;
    	
    	@Enumerated(EnumType.STRING)
    	public Gender getGender() {
    		return gender;
    	}
    	public void setGender(Gender gender) {
    		this.gender = gender;
    	}
    	public boolean isGood() {
    		return good;
    	}
    	public void setGood(boolean good) {
    		this.good = good;
    	}
    	@Transient
    	public String getYourWifeName() {
    		return yourWifeName;
    	}
    	public void setYourWifeName(String yourWifeName) {
    		this.yourWifeName = yourWifeName;
    	}
    	@Id
    	@GeneratedValue(strategy=GenerationType.TABLE, generator="Teacher_GEN")
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	
    	@Id
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	@Temporal(TemporalType.TIME)
    	public Date getBirthDate() {
    		return birthDate;
    	}
    	public void setBirthDate(Date birthDate) {
    		this.birthDate = birthDate;
    	}
    	
    	/*@EmbeddedId
    	public TeacherPK getPk() {
    		return pk;
    	}
    	public void setPk(TeacherPK pk) {
    		this.pk = pk;
    	}*/
    }
    

     

延伸阅读:

Tag标签: hibernate联合主键  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规