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))
会产生如上的表结构