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
- hibernate 映射配置总结
- hibernate总结---继承映射
- Hibernate映射总结
- Hibernate 映射总结!
- Hibernate 关联映射总结
- hibernate继承映射总结!
- Hibernate关联映射总结
- Hibernate关系映射总结
- Hibernate映射类型总结
- Hibernate映射总结
- Hibernate映射文件总结
- hibernate映射关系总结
- hibernate关系映射总结
- Hibernate关系映射总结
- hibernate总结-映射
- 【Hibernate】映射关系总结
- 【Hibernate】映射关系总结
- Hibernate关系映射总结(一)
- HDU 1034 Candy Sharing Game
- linux 的压栈操作
- 线性链表的储存
- SDK 被屏蔽怎么办
- JSP基础知识(学习笔记)
- Hibernate映射总结
- 我的音乐世界----戴着镣铐起舞
- Volley源码学习笔记1
- linux下android开发环境搭建及NDK安装(转)
- 《高性能MYSQL》学习(二)
- 线程池
- MySQL主从复制实验记录
- Wireshark网络分析系列
- C++ int与string的转化