x.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Depart {
private Integer id;
private String departName;
private String departNum;
private Set
emp;
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=50,nullable=false,unique=true)
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
public String getDepartNum() {
return departNum;
}
public void setDepartNum(String departNum) {
this.departNum = departNum;
}
@OneToMany(cascade={CascadeType.REMOVE,CascadeType.PERSIST},mappedBy="depart")
public Set
getEmp() { return emp; } public void setEmp(Set
emp) { this.emp = emp; } }
一对多关联使用的注解是@OneToMany,cascade就不解释了,mappedBy属性主要用在关系被维护端,在这里就是一的这一边,mappedBy="depart"表明在关系维护端对应的属性为depart
package org.lxh.info;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
private Integer id;
private String num;
private String name;
private Depart depart;
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
@Column(nullable=false,length=50)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne
@JoinColumn(name="depart_id")
public Depart getDepart() {
return depart;
}
public void setDepart(Depart depart) {
this.depart = depart;
}
}
Employee作为关系维护端负责外键字段或外键记录的更新,体现在
数据库中则为从表,里面含有一个外键和depart相对应。@JoinColumn用来指定外键的列名,从程序可以看出这里的外键列名为depart_id
2 使用单元测试保存数据
package org.lxh.test;
import static org.junit.Assert.*;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.lxh.info.Depart;
import org.lxh.info.Employee;
import org.lxh.util.JpaUtil;
public class Test {
@org.junit.Test
public void testInsert() {
EntityManager em=null;
EntityTransaction tx=null;
try{
em=JpaUtil.getEntityManager();
tx=em.getTransaction();
tx.begin();
Depart d=new Depart();
d.setDepartName("质量管理部");
d.setDepartNum("DP0001");
Employee e=new Employee();
e.setDepart(d);
e.setName("李明");
e.setNum("C0001");
Set
emps=new HashSet
(); emps.add(e); d.setEmp(emps);; em.persist(d); tx.commit(); }catch(Exception e){ e.printStackTrace(); }finally{ if(em!=null){ em.close(); } } } }
下面是打印出的sql语句:
Hibernate:
insert
into
Depart
(departName, departNum)
values
(?, ?)
Hibernate:
insert
into
Employee
(depart_id, name, num)
values
(?, ?, ?)
这样数据就保存成功了,其他操作暂时忽略,大家可以自己写一写
二 一对一关联关系
一对一关联使用的场合相对较少,好多人都会把两个表并为一个,字段看起来很多但是操作起来着实方便
1 先来看看实体,我的例子是人员和人员信息详细表的对于关系
package org.lxh.info;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persi