Hibernate映射总结

Hibernate 自动生成表,在对象之间有一对一单向和双向,一堆多单向和双向, 多对一单向和双向,多对多。对应到数据库里的表结构都是什么样的。


OneToMany 最简单的单向

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Department {
	private int id;
	private String name;
	private Set<User> users;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@OneToMany
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
	
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {
	
	private int id;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

在Department端有user 的set集合,是一个department 对多个user 如上的注解方式会生成三个表

create table Department (id integer not null auto_increment, name varchar(255), primary key (id))
create table Department_User (Department_id integer not null, users_id integer not null, primary key (Department_id, users_id))
create table User (id integer not null auto_increment, name varchar(255), primary key (id))

利用反向工程能看到对应关系

在Department 中指定@joinColumn(name="department_id")不会生成中间表,会在多的那方生成少的那方的外键关联

 create table Department (id integer not null auto_increment, name varchar(255), primary key (id))
 create table User (id integer not null auto_increment, name varchar(255), department_id integer, primary key (id))
单向的一对多等价于多对一,即上面的一堆对多和在User里声明增加一个Department属性 用ManyToOne 做注解等价的
但是我 想在Department 里有set<User>属性,同时在User里有Department属性,就得用到双向的了吧。
需要在一端用mappedBy 来指定映射的属性
<pre name="code" class="java">package mapping.manytoone;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

@Entity
public class Department {
	private int id;
	private String name;
	private Set<User> users;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@OneToMany(mappedBy="department")
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
	
}

package mapping.manytoone;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class User {
	
	private int id;
	private String name;
	private Department department;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@ManyToOne
	@JoinColumn(name="department_id")
	public Department getDepartment() {
		return department;
	}
	public void setDepartment(Department department) {
		this.department = department;
	}
	
}

这是测试用的代码

 
<pre name="code" class="java">package mapping.manytoone;

import mapping.util.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;

public class TestMapping {
	@Test
	public void testOneToMany(){
	SessionFactory	sessionFactory=HibernateUtil.getSessionFactory();
		Session session=sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.save(new Department());
		session.getTransaction().commit();
	}
}

用到了hibernate文档中一个HibernateUtil工具类
 
<pre name="code" class="java">package mapping.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
        	//return  new Configuration().configure().buildSessionFactory(
			    //new StandardServiceRegistryBuilder().build() );
        	
        	
        	Configuration configuration = new Configuration().configure(); 
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
            SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
            return sessionFactory; 
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

多对多的情况类似,但是有时候一个类自身有映射关系,比如department 有自己的一个上级部门,同时也有一些下级部门,假设department有一个parent:Department 属性和
 
dhildren:Set<Department>  在数据库中的管理应该是只需要在department表中增加一个字段就parent_id就好
如把Department修改成下面这样子
<pre name="code" class="java">package mapping.manytoone;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Department {
	private int id;
	private String name;
	private Set<User> users;
	
	private Department parent;
	private Set<Department> children;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@OneToMany(mappedBy="department")
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
	
	@ManyToOne
	@JoinColumn(name="parent_id")
	public Department getParent() {
		return parent;
	}
	public void setParent(Department parent) {
		this.parent = parent;
	}
	
	@OneToMany(mappedBy="parent")
	public Set<Department> getChildren() {
		return children;
	}
	public void setChildren(Set<Department> children) {
		this.children = children;
	}
	
	
}

 create table Department (id integer not null auto_increment, name varchar(255), parent_id integer, primary key (id))
 create table User (id integer not null auto_increment, name varchar(255), department_id integer, primary key (id))

会产生如上的表结构

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值