Hibernate学习——(七)联合主键映射以及组件映射

一、联合主键映射

果有时候需要将多个属性合并在一起作为主键,则需要使用使用联合主键映射的形式。

首先将联合主键需要的属性包装在一个class中:

ManagerPK.java:

package cn.wqy.dao;

import java.io.Serializable;

public class ManagerPK implements Serializable{
	private int manager_id;
	private String manager_name;

	public int getManager_id() {
		return manager_id;
	}

	public void setManager_id(int manager_id) {
		this.manager_id = manager_id;
	}

	public String getManager_name() {
		return manager_name;
	}

	public void setManager_name(String manager_name) {
		this.manager_name = manager_name;
	}
}
注意这里要继承Serializable接口,bean类必须序列化。

之后在实体类中作关于联合主键的annotation:

Manager.java:(部分代码见下)

@IdClass(ManagerPK.class)
public class Manager {
	private int manager_id;
	private String manager_name;
	private String manager_password;

	@Id
	public int getManager_id() {
		return manager_id;
	}

	@Id
	public String getManager_name() {
		return manager_name;
	}
}   ...

之后要对从表对应的实体类进行annotation设置:(部分代码见下)

	@OneToOne
	@JoinColumns({
			@JoinColumn(name = "Man_Id", referencedColumnName = "manager_id"),
			@JoinColumn(name = "Man_Name", referencedColumnName = "manager_name") })
	public Manager getManager() {
		return manager;
	}

在测试类中做如下测试:

	@Test
	public void testManagerSave() {

		ManagerPK m_PK = new ManagerPK();
		Manager m = new Manager();
		Manager_Msg msg = new Manager_Msg();

		Session s = HibernateSessionFactory.getSession();
		Transaction tran = s.beginTransaction();
		
		m_PK.setManager_id(1);
		m_PK.setManager_name("王qy");
		
		m = (Manager) s.get(Manager.class, m_PK);
		
		msg.setManager_id(1);
		msg.setManager_name("王qy");
		msg.setManager(m);

		System.out.println(msg.getManager().getManager_password());

		tran.commit();
		s.close();
	}

在此处get方法中需要添加的是联合主键对象m_PK,否则会报主键对象不匹配的错误。

二、组件映射

在Hibernate中,组件是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),组件是一个被包含的对象

他作为值类型被持久化,而非一个实体。利用组件映射,可以将存在映射关系的两个类对应的字段放在同一张表中。

在附加的类中,去掉@Entity,@Id等annotation标记,注意其不能有主键,同时注意不能有命名上的冲突。

之后,在被附加的类上加上新的Annotation标记:

	@Embedded
	public Manager getManager() {
		return manager;
	}
同时注意在hibernate.cfg.xml文件中不能有附加组件的mapping声明,只有实体类的mapping声明。

采用组件映射的优点:实现了对象细粒度的划分,层次更加分明,复用率高。上面的student类,分为了基本信息id、name,

还将联系方式作为contact类分离了出来,此外,还可以将爱好等信息再作为一类分离出来,这是我理解的细粒度的划分。分离出来

的联系方式和爱好等,也可以作为其他对象(例如teacher、employer等)的组件,这样就为用提供了方便。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值