在Hibernate中,@OneToMany单/双向外键关联
来源:互联网 发布:c语言多线程并行案例 编辑:程序博客网 时间:2024/06/18 06:09
一对多单/双向外键关联:指一方持有多方的集合。比如说一个屌丝拥有多个美女。
(一)@OneToMany支持的属性
属性 说明cascade:1.CascadeType.All:将所有持久化操作级联到关联使用 2.CascadeType.MERGE:将merge操作级联到关联实体 3.CascadeType.PERSIST:将persist操作级联到关联实体 4.CascadeType.REFRESH:将refresh操作级联到关联实体 5.CascadeType.REMOVE:将remove操作级联到关联实体fetch: 1.FetchType.EAGER:立即抓取关联实体 2.FetchType.LAZY:延迟抓取关联实体,需要它时再去抓取。orphanRemovel 1.设置是否删除“孤儿”实体 mappyBy 1.该属性指定关联实体中的哪个属性可以引用到当前实体。targetEntity 1.该属性指定关联实体的类名,通过反射获得关联实体类名
1.一对多单向外键关联
代码如下:
package cn.codeWang.entity;import java.util.ArrayList;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToMany;@Entity(name = "Person")public class Person { @Id @GeneratedValue @Column(name = "person_id") private Long id; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<Phone> phones = new ArrayList<>(); public Person() { } public List<Phone> getPhones() { return phones; }}package cn.codeWang.entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity(name = "Phone")public class Phone { @Id @GeneratedValue private Long id; @Column(name = "`number`") private String number; public Phone() { } public Phone(String number) { this.number = number; } public Long getId() { return id; } public String getNumber() { return number; }}
2.配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 配置连接数据库 --> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property> <!-- 配置方言是非常重要!!!我这里配置的为MySQL5Dialect --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 配置C3P0连接池 --> <property name="hibernate.c3p0.max_size">200</property> <property name="hibernate.c3p0.min_size">2</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.timeout"></property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- 配置映射文件 --> <!-- <property name="hibernate.current_session_context_class">thread</property> --> <mapping class="cn.codeWang.entity.Person"/> <mapping class="cn.codeWang.entity.Phone"/> </session-factory></hibernate-configuration>
3.测试类
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codeWang.entity.Person;import cn.codeWang.entity.Phone;public class DemoTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { // 创建服务注册对象 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 创建会话工厂对象 sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); // 会话对象 session = sessionFactory.openSession(); // 开启事物 transaction = session.beginTransaction(); } @After public void destory() { // 提交事物 transaction.commit(); // 关闭会话 session.close(); // 关闭会话工厂 sessionFactory.close(); } @Test // 向数据库中添加数据 public void testSave() { Person person = new Person(); Phone phone1 = new Phone("123-456-7892"); Phone phone2 = new Phone("123-456-7893"); person.getPhones().add(phone1); person.getPhones().add(phone2); session.save(phone1); session.save(phone2); session.save(person); }}
总结:@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)修饰集合属性。
2.一对多双向外键关联
代码如下:
package cn.codeWang.entity;import java.util.ArrayList;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToMany;@Entity(name = "Person")public class Person { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true) private List<Phone> phones = new ArrayList<>(); public Person() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public List<Phone> getPhones() { return phones; } public void addPhone(Phone phone) { phones.add(phone); phone.setPerson(this); } public void removePhone(Phone phone) { phones.remove(phone); phone.setPerson(null); }}package cn.codeWang.entity;import java.util.Objects;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import org.hibernate.annotations.NaturalId;@Entity(name = "Phone")public class Phone { @Id @GeneratedValue private Long id; @NaturalId @Column(name = "`number`", unique = true) private String number; @ManyToOne private Person person; public Phone() { } public Phone(String number) { this.number = number; } public Long getId() { return id; } public String getNumber() { return number; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } @Override public boolean equals(Object o) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } Phone phone = (Phone) o; return Objects.equals( number, phone.number ); } @Override public int hashCode() { return Objects.hash( number ); }}import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codeWang.entity.Person;import cn.codeWang.entity.Phone;public class DemoTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { // 创建服务注册对象 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); // 创建会话工厂对象 sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); // 会话对象 session = sessionFactory.openSession(); // 开启事物 transaction = session.beginTransaction(); } @After public void destory() { // 提交事物 transaction.commit(); // 关闭会话 session.close(); // 关闭会话工厂 sessionFactory.close(); } @Test // 向数据库中添加数据 public void testSave() { Person person = new Person(); Phone phone1 = new Phone( "123-456-7890" ); }}
控制台输出结果:
Hibernate: create table Person ( id bigint not null, primary key (id) ) engine=MyISAMHibernate: create table Phone ( id bigint not null, `number` varchar(255), person_id bigint, primary key (id) ) engine=MyISAMHibernate: alter table Phone add constraint UK_l329ab0g4c1t78onljnxmbnp6 unique (`number`)Hibernate: alter table Phone add constraint FKmw13yfsjypiiq0i1osdkaeqpg foreign key (person_id) references Person (id)
总结:两个持久化类中出现“你中有我,我中有你”。
1.@OneToMany(mappedBy = “person”, cascade = CascadeType.ALL, orphanRemoval = true)修饰集合属性。
2. @ManyToOne修饰private Person person;
3.Phone类必须实现hashCade()和equals()方法
阅读全文
0 0
- 在Hibernate中,@OneToMany单/双向外键关联
- 在Hibernate中@ManyTOMany 单/双向外键关联
- Hibernate一对一单双向外键关联
- 【Hibernate】双向关联的oneTomany练习
- Hibernate之一对多单向外键关联(OneToMany)
- Hibernate基础之九:多对多,单/双向关联 @ManyToOne @OneToMany
- Hibernate基础之九:多对多,单/双向关联 @ManyToOne @OneToMany
- JPA OneToMany双向关联
- Hibernate 使用 Annotation 之 OneToMany(双向关联关系)
- Hibernate xml配置方法之OneToMany(双向关联关系)
- Hibernate中的单,双向关联
- hibernate 单向外键关联,一对一双向外间关联凡是双向关联必设mappedBy!!!
- Hibernate 中annotations(注解开发)的@OneToMany 一对多双向关联映射后,出现的jar包冲突问题
- @ManyToOne和@OneToMany双向关联
- 双向一对多关联OneToMany
- 一对一唯一外键关联(单双向)
- Hibernate基础之八:一对一单/双向,主/外键关联 @OneToOne@JoinColumn
- Hibernate基础:一对一单/双向,主/外键关联 @OneToOne@JoinColumn
- 在Beaglebone Black上使用C++实现can通讯
- R向量赋值和操作
- 洛谷P2303 [SDOi2012]Longge的问题
- hdu 6093 数位暴力
- jsp基础与提高(EL、JSTL)
- 在Hibernate中,@OneToMany单/双向外键关联
- LOj 2000「SDOI2017」数字表格 (莫比乌斯反演)
- python中的孤儿进程
- RNN之LSTM(3)
- Java学习经典案例
- 分布式事务-例子讲解
- 606. Construct String from Binary Tree
- IDEA快捷键设置成eclipse快捷键
- 洛谷P2516 [HAOI2010]最长公共子序列