Self Join One To Many In Hibernate


Hôm nay mình giới thiệu các bạn việc mapping mối quan hệ one-to-many self join .

Một table tạo ra mối quan hệ với chính nó bới nhựng field khác nhau. Ví dụ chúng ta có thể thấy . Một Nhân viên có thể chưa id của manager ngưới quản lí mình. và Manager thực chất củng là một nhân viên. Self join hay còn gọi là Self reference nó dự trên cấu trúc Parent/Child. Sau đây chúng ta sẻ demo  việc mapping mối quan hệ giữa Manager/employees

Source code : Download

Hình ảnh của database

d1

</pre>
CREATE TABLE `employee` (
 `employee_id` BIGINT(10) NOT NULL AUTO_INCREMENT,
 `firstname` VARCHAR(50) NULL DEFAULT NULL,
 `lastname` VARCHAR(50) NULL DEFAULT NULL,
 `manager_id` BIGINT(20) NULL DEFAULT NULL,
 PRIMARY KEY (`employee_id`),
 CONSTRAINT `FK_MANAGER` FOREIGN KEY (`manager_id`) REFERENCES `employee` (`employee_id`)
)
<pre>

Hình ảnh cấu trúc thư mục :
d1

Ở đây table Employee có một column manager_id nó được mapped với primary key employee_id. Vì vậy mổi employee chúng ta sẻ lưu trữ manager_id cho nó. Và manager củng là một employee ( một record ) trong table employee này.


package model;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="employee")
public class Employee {
	@Id
	@Column(name="employee_id")
	@GeneratedValue()
	private Long employeeId;

	@Column(name="firstname")
	private String firstname;

	@Column(name="lastname")
	private String lastname;

	@ManyToOne(cascade={CascadeType.ALL})
	@JoinColumn(name="manager_id")
	private Employee manager;

	@OneToMany(mappedBy="manager")
	private Set<Employee> subordinates  = new HashSet<Employee>();

	public Employee() {

	}

	public Employee(String firstname, String lastname) {
		this.firstname = firstname;
		this.lastname = lastname;
	}

	public Long getEmployeeId() {
		return employeeId;
	}

	public void setEmployeeId(Long employeeId) {
		this.employeeId = employeeId;
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

	public Employee getManager() {
		return manager;
	}

	public void setManager(Employee manager) {
		this.manager = manager;
	}

	public Set<Employee> getSubordinates() {
		return subordinates;
	}

	public void setSubordinates(Set<Employee> subordinates) {
		this.subordinates = subordinates;
	}

}

Chúng ta chú ý rằng trong class Employee này phải định nghĩa thêm 2 thuộc tính mới chình là Employee manager và Set<Employee> subordinates . Thuộc tính manager thì được mapped với mối quan hệ @ManyToOne với ý nghĩa ( 1 Manager – N employee)  và Set subordinates thì được mapped với  manager theo mối quan hệ @OneToMany . Tạo ta manager như là mối quan hệ sở hữu và thể hiện manager_id như khóa ngoại của table.

File Hibernate.cgf.xml


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
 <session-factory>
 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="hibernate.connection.url">jdbc:mysql://localhost/dbTest</property>
 <property name="hibernate.connection.username">root</property>
 <property name="hibernate.connection.password">123456</property>
 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

 <!-- JDBC connecition pool (use the built-in) -->
 <property name="hibernate.connection.pool_size">1</property>
 <!-- Enable Hibernate's automatic session context management -->
 <property name="hibernate.current_session_context_class">thread</property>

 <!-- Echo all executed SQL to stdout -->
 <property name="show_sql">true</property>
 <property name="format_sql">false</property>
 <property name="hbm2ddl.auto">Validate</property>

 <!-- Mapping to Resource -->
 <mapping class="model.Employee"/>

</session-factory>
</hibernate-configuration>

Ok giờ chúng ta test chương trình.

TestMain.java như sau :


package test;

import model.Employee;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

public class TestMain {

public static void main(String[] args) {

SessionFactory sessionFactory = HibernateUtil.getSeesionfactory();

Session session = sessionFactory.openSession();

Transaction trns = null;

try {

trns = session.beginTransaction();

Employee manager = new Employee("Hoàng", "Hải");

Employee employee1 = new Employee("Jenny", "Tí");

Employee employee2 = new Employee("Jenny", "Tèo");

Employee employee3 = new Employee("Jenny", "Tủn");



employee1.setManager(manager);

employee2.setManager(manager);

employee3.setManager(manager);



session.save(employee1);

session.save(employee2);

session.save(employee3);


trns.commit();


} catch (Exception e) {

if(trns != null){

trns.rollback();

e.printStackTrace();

}

}finally{

session.flush();

session.close();

}

}

&nbsp;

}


Đoạn code trên mình tạo ra một manager tên là kobee. và tạo ra 3 employee . và thiết lập manager cho nó. sau đó thêm 3 employee vào database.

kết quả sau khi chạy database sẻ hiển thị như sau :

d1

Ok chúc các bạn thành công.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: