hibernate--联合主键--annotation

有3种方式:

[email protected]

[email protected]

3. @IdClass

2,3 最常用

一, @Embeddedable

1.新建TeacherPK.java, 加入@Embeddable:

package com.bjsxt.hibernate;

import javax.persistence.Embeddable;

@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;
    }

}

2. 重写Teacher.java, 加入pk对象, 并设置@Id:

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="_Teacher")
public class Teacher {
	private TeacherPK pk;
	@Id
	public TeacherPK getPk() {
		return pk;
	}
	public void setPk(TeacherPK pk) {
		this.pk = pk;
	}
	private String title;

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

3. 重写junit测试方法:

@Test
	public void testTeacherSave() {
		TeacherPK pk=new TeacherPK();
		pk.setId(1);
		pk.setName("lisi");

		Teacher t =new Teacher();
		t.setPk(pk);
		t.setTitle("higfdfsdfsadh");

		Session session =  sf.openSession();
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
		session.close();
	}

二: @EmbeddedId

1. 去掉TeacherPK.java的@Embeddable:

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;
    }

}

  

2. Teacher.java里@Id的地方改成@EmbeddedId

package com.bjsxt.hibernate;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;

@Entity
@Table(name="_Teacher")
//@IdClass(value=TeacherPK.class)
public class Teacher {
	private TeacherPK pk = new TeacherPK();
	@EmbeddedId
	public TeacherPK getPk() {
		return pk;
	}
	public void setPk(TeacherPK pk) {
		this.pk = pk;
	}
	private String title;	

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

  

3. test方法:

@Test
	public void testTeacherSave() {
		TeacherPK pk=new TeacherPK();
		pk.setId(2);
		pk.setName("lisi");

		Teacher t =new Teacher();
		t.setPk(pk);
		t.setTitle("higfdfsdfsadh");

		Session session =  sf.openSession();
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
		session.close();
	}

  

三, @IdClass

1. 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;
    }

}

2. Teacher.java里类前加入IdClass:

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;

@Entity
@Table(name="_Teacher")
@IdClass(value=TeacherPK.class)
public class Teacher {
	private int id;
	private String name;
	private String title;

	@Id
	@GeneratedValue
	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 String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

3. junit的测试方法;

@Test
	public void testTeacherSave() {
		Teacher t =new Teacher();
		t.setId(1);
		t.setName("zhagnsan");
		t.setTitle("higfdfsdfsadh");

		Session session =  sf.openSession();
		session.beginTransaction();
		session.save(t);
		session.getTransaction().commit();
		session.close();
	}

  

时间: 2024-10-12 05:31:29

hibernate--联合主键--annotation的相关文章

hibernate联合主键

一. hibernate联合主键类的规则 1. 实现Serializable接口 2. 重写hashCode与equals方法 二.hibernate联合主键的实体类规则原因(与上面规则顺序对应) 1. Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象.这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中: 2. 使用get或load方法的时候需要先

hibernate 联合主键生成机制(组合主键XML配置方式)

hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hi

hibernate联合主键不便之处(转)

在使用hibernate的联合主键时有以下几个需要注意的问题: 1.首先就是映射文件中联合主键的写法, 例子: Java代码   <composite-id name="sid" class="cn.test.po.IpAndSubphoneId"> <key-property name="ip" type="java.lang.String"> <column name="IP&quo

hibernate联合主键映射

联合主键用的不是很多,用的时候查到就是. Wife里id和name联合做主键,需要新建一个主键类,WifePK,必须实现Serializable接口,重写hashcode.equals. 在Husband类里用Wife的id和name做外键关联. Wife类: package com.oracle.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.pe

IT忍者神龟之Hibernate联合主键下,主键生成策略

如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的.但最好这样做. 不能使用一个 Ide

hibernate 联合主键

xml配置 需要一个主键类: package com.bxw.entity; import java.io.Serializable; public class StudentPk implements Serializable{ private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public Str

hibernate ——联合主键

接上一篇博客:http://www.cnblogs.com/tengpan-cn/p/5551323.html 主键类不需要写任何注解,表对象类使用@IdClass注解 在表对象类前面加@IdClass(value=主键类名.class)然后,表对象类中也不必包含主键类,直接分成各个属性即可.在多个属性前加@ID 添加主键类,注意必须实现Serializable接口 package com.pt.hibernate; import java.io.Serializable; public cla

hibernate联合主键 注解方式

1.方法一 主键类用@Embeddable,pojo类仍然用@Entity但是引用主键类的对象用@Id 主键pojo类: @Embeddable public class composeIdPK implements Serializable { private String name; private int id; @Column(length=20,name="pkName") public String getName() { return name; } @Column(le

hibernate联合主键注解配置

在网上看到好多方法,结果拿来用还是出现了一些问题.现在整理一下 1.主键类 import javax.persistence.Column; public class UserRoleUionPK implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1L; private String userId; private String roleId; /*public User

hibernate联合主键 组合组件(component)

package db.domain; /** * PersonId entity. @author MyEclipse Persistence Tools */ public class PersonId implements java.io.Serializable { // Fields private String firstname; private String lastname; // Constructors /** default constructor */ public Pe