Hibernate映射总结

来源:互联网 发布:macbook 软件 无法安装 编辑:程序博客网 时间:2024/05/16 23:43

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


OneToMany 最简单的单向

import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToMany;@Entitypublic class Department {private int id;private String name;private Set<User> users;@Id@GeneratedValuepublic 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;}@OneToManypublic 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;@Entitypublic class User {private int id;private String name;@Id@GeneratedValuepublic 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;@Entitypublic class Department {private int id;private String name;private Set<User> users;@Id@GeneratedValuepublic 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;@Entitypublic class User {private int id;private String name;private Department department;@Id@GeneratedValuepublic 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 {@Testpublic void testOneToMany(){SessionFactorysessionFactory=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;@Entitypublic class Department {private int id;private String name;private Set<User> users;private Department parent;private Set<Department> children;@Id@GeneratedValuepublic 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
原创粉丝点击