环境:hbiernate 4.2.16 ,
注意:
1. hibernate4.2 实现了 jpa2.0 规范,而 hibernate4.3 实现了 jpa2.1 规范,这个要和persistence配置文件统一,不然会出现问题。
2. hibernate jpa 包 和 javaEE 包 下都有 javax.persistence.* , 有冲突,必须删掉一个。
实体类:
这些表都是从oracle的 hr 用户中导出来的,只配置了 employee 和 department 的关联关系。
Region.java
package com.jt.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="REGIONS",schema="hr")
public class Region implements Serializable{
private static final long serialVersionUID = 2050774342066489506L;
private Integer regionId;
private String regionName;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="region_id")
public Integer getRegionId() {
return regionId;
}
public void setRegionId(Integer regionId) {
this.regionId = regionId;
}
@Column(name="region_name")
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
@Override
public String toString() {
return "Region [regionId=" + regionId + ", regionName=" + regionName
+ "]";
}
}
Employee.java
package com.jt.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="EMPLOYEES",schema="hr")
public class Employee implements Serializable{
private static final long serialVersionUID = 1637224465679960860L;
private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneInt;
private Date hireDate;
private String jobId;
private Double salary;
private Double commissionPct;
private Integer managerId;
private Department department;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="employee_id")
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
@Column(name="first_name")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name="last_name")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Column
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name="phone_int")
public String getPhoneInt() {
return phoneInt;
}
public void setPhoneInt(String phoneInt) {
this.phoneInt = phoneInt;
}
@Column(name="hire_date")
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
@Column(name="job_id")
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
@Column
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Column(name="commission_pct")
public Double getCommissionPct() {
return commissionPct;
}
public void setCommissionPct(Double commissionPct) {
this.commissionPct = commissionPct;
}
@Column(name="manager_id")
public Integer getManagerId() {
return managerId;
}
public void setManagerId(Integer managerId) {
this.managerId = managerId;
}
@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name="department_id") // 多对一关联,指向 “一” 的外键列名
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee [commissionPct=" + commissionPct + ", department="
+ department + ", email=" + email + ", employeeId="
+ employeeId + ", firstName=" + firstName + ", hireDate="
+ hireDate + ", jobId=" + jobId + ", lastName=" + lastName
+ ", managerId=" + managerId + ", phoneInt=" + phoneInt
+ ", salary=" + salary + "]";
}
}
Department.java
package com.jt.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="DEPARTMENTS",schema="hr")
public class Department implements Serializable{
private static final long serialVersionUID = -1001327680627174429L;
private Integer departmentId;
private String departmentName;
private Integer managerId;
private Integer locationId;
private Set<Employee> employees = new HashSet<Employee>();
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="department_id")
public Integer getDepartmentId() {
return departmentId;
}
public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
}
@Column(name="department_name")
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
@Column(name="manager_id")
public Integer getManagerId() {
return managerId;
}
public void setManagerId(Integer managerId) {
this.managerId = managerId;
}
@Column(name="location_id")
public Integer getLocationId() {
return locationId;
}
public void setLocationId(Integer locationId) {
this.locationId = locationId;
}
// 这里是一方,mappedBy 是在“多”的那方指向“一”的 属性
// FetchType.LAZY 是延迟加载,会发出两条sql语句,先查employee,再查department
// FetchType.EAGER 是 发出一条sql语句,关联查询employees 和department
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="department")
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
@Override
public String toString() {
return "Department [departmentId=" + departmentId + ", departmentName="
+ departmentName + ", employees.size=" + employees.size() + ", locationId="
+ locationId + ", managerId=" + managerId + "]";
}
}
META-INF/persistence.xml 配置文件:
<?xml version="1.0" encoding="utf-8"?>
<persistence xmlns="
http://java.sun.com/xml/ns/persistence
"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_0.xsd
"
version="2.0">
<persistence-unit name="dev" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.connection.url" value="jdbc:mysql://192.168.1.200:3306/hr" />
<!-- <property name="hibernate.max_fetch_depth" value="3" /> -->
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
测试:
package com.jt.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.jt.entity.Department;
import com.jt.entity.Employee;
import com.jt.entity.Region;
public class AllTest {
EntityManagerFactory entityManagerFactory;
EntityManager entityManager;
@Before
public void init(){
entityManagerFactory =
Persistence.createEntityManagerFactory("dev");
entityManager = entityManagerFactory.createEntityManager();
}
@Test
public void test1(){
System.out.println(entityManager.getClass().getName());
}
@Test
public void testManyToOne(){
// 多对一测试
Employee employee = entityManager.find(Employee.class, 106);
System.out.println(employee);// 重写了toString方法,同时输出 department信息
}
@Test
public void testOneToMany(){
// 一对多测试
Department department = entityManager.find(Department.class, 60);
System.out.println("dept_name:"+department.getDepartmentName());
for(Employee emp : department.getEmployees()){
System.out.println(emp.getFirstName()+' '+emp.getLastName()+','+emp.getSalary());
}
}
@Test
public void testFind(){
Region region = entityManager.find(Region.class, 3);
System.out.println(region);
}
@Test
public void testAdd(){
Region region = new Region();
//region.setRegionId(5);
region.setRegionName("moon");
entityManager.getTransaction().begin();
entityManager.persist(region);
entityManager.getTransaction().commit();
}
@Test
public void testDel(){
Region region = entityManager.find(Region.class, 5);
entityManager.getTransaction().begin();
entityManager.remove(region);
entityManager.getTransaction().commit();
}
@SuppressWarnings("unchecked")
@Test
public void testFindAll(){
Query query = entityManager.createQuery("select r from Region r");
List<Region> list = query.getResultList();
for (Region region : list) {
System.out.println(region);
}
}
@After
public void close(){
entityManager.close();
entityManagerFactory.close();
}
}