首先需要弄清楚什么是外键。如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此
可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从
表。外键又称作外关键字。
利用外键建立起来的一对一映射,一对一的连接了两张表,使其具有了唯一的映射关系。这种映射就叫作一对一外键映射。
在Hibernate中,可以采用Xml的方式配置,也可以采用annotation的方式配置。由于annotation的配置方式相当简便而且一目了
然,因此直接采用annotation的配置。
Manager.java:
package cn.wqy.dao;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "manager_backup")
public class Manager {
private int manager_id;
private String manager_name;
private String manager_password;
private Manager_Msg manager_msg;
@Id
public int getManager_id() {
return manager_id;
}
@OneToOne
@JoinColumn(name="man_id")
public Manager_Msg getManager_msg() {
return manager_msg;
}
public String getManager_name() {
return manager_name;
}
public String getManager_password() {
return manager_password;
}
public void setManager_id(int manager_id) {
this.manager_id = manager_id;
}
public void setManager_msg(Manager_Msg manager_msg) {
this.manager_msg = manager_msg;
}
public void setManager_name(String manager_name) {
this.manager_name = manager_name;
}
public void setManager_password(String manager_password) {
this.manager_password = manager_password;
}
}
Manager_msg.java:
package cn.wqy.dao;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "manager_message")
public class Manager_Msg {
private int manager_id;
private String manager_name;
private Date manager_birthday;
private Boolean isMarried;
// private int man_id;
public Boolean getIsMarried() {
return isMarried;
}
public Date getManager_birthday() {
return manager_birthday;
}
@Id
public int getManager_id() {
return manager_id;
}
public String getManager_name() {
return manager_name;
}
public void setIsMarried(Boolean isMarried) {
this.isMarried = isMarried;
}
public void setManager_birthday(Date manager_birthday) {
this.manager_birthday = manager_birthday;
}
public void setManager_id(int manager_id) {
this.manager_id = manager_id;
}
public void setManager_name(String manager_name) {
this.manager_name = manager_name;
}
}
上面是两个实体类,manager_msg是主表,manager_backup是从表。
由于要添加映射关系,所以在manager的实体类中添加了manager_msg对象属性及其getter、setter方法。在manager_msg的
getter方法上加上了@oneToOne注解。同时加上了@joinColumn注解,利用其中属性表示了是对其man_id字段添加外键约束,从表中有一名为
man_id的列,默认和主表的主键关联。如果不想关联主键,可以重新指定,设置referencedColumnName的值,指定要关联的列名。
之后在hibernate.cfg.xml中加入类的映射:
<mapping class="cn.wqy.dao.Manager_Msg"/>
<mapping class="cn.wqy.dao.Manager" />
即可。
以下利用JUnit4进行测试:
static {
Configuration conf = new Configuration();
conf.configure();
}
@Test
public void testManagerSave() {
Manager m = new Manager();
Manager_Msg msg = null;
Session s = HibernateSessionFactory.getSession();
Transaction tran = s.beginTransaction();
m = (Manager) s.get(Manager.class, 1);
msg = m.getManager_msg();
s.delete(m);*/
System.out.println(msg);
System.out.println(m);
tran.commit();
s.close();
}
可以利用外键映射关系找到msg对象。Ps:在用MyEclipse10(JavaEE5)开发时,导入其自身对Hibernate的支持和junit4之后,会发现报错,这是由于JavaEE5的
@oneToOne缺少一个方法而导致。删除Java EE 5 Libraries,添加Java EE 6 Libraries。会发现报Error applying BeanValidation
relational constraints,这是因为在J2EE6中javax.persistence.validation.mode默认情况下是auto,如果不设置的话会自动去自己的
classpath下找一个bean-validation的包,找不到,所以会报beanvalidationFactory的错。解决方法是在hibernate.cfg.xml中添加如下
配置:
<property name="javax.persistence.validation.mode">none</property>
即可解决。