Hibernate 1-N单向关联(注解实现)
来源:互联网 发布:文件归档软件 编辑:程序博客网 时间:2024/06/06 04:55
无连接表的1-N单向关联
Person.java(1端)
package com.oneToMany;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name="person_inf")public class Person { @Id @Column(name="person_id")//name="person_id" @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private int age; @OneToMany(targetEntity=Address.class) //映射外键列,此处映射的外键列会添加到关联实体对应的数据库中 @JoinColumn(name="fk_person_id" ,referencedColumnName="person_id")//name="fk_person_id" ,referencedColumnName="person_id" //N的一端以集合set形式出现 private Set<Address> address=new HashSet<Address>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Set<Address> getAddress() { return address; } public void setAddress(Set<Address> address) { this.address = address; }}
Address.java(N端)
package com.oneToMany;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="address_inf")//catalog="hibernate_oneToMany",name="address_inf"public class Address { @Id @Column(name="address_id")//name="address_id" @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String addressDetail; public Address(){} public Address(String addressDetail ){ this.addressDetail=addressDetail; } public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } public void setAddressDetail(String addressDetail) { this.addressDetail = addressDetail; } public String getAddressDetail() { return addressDetail; }}
TestDemo.java
public static void test2() { StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); SessionFactory factory = new MetadataSources(registry).buildMetadata() .buildSessionFactory(); // 获取Session Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); try { Person person = new Person(); // 持久化Person对象 session.save(person); Address address = new Address("GDUT"); person.setName("Jeff"); person.setAge(21); // 持久化Address对象 session.persist(address); // 添加地址1 person.getAddress().add(address); Address address2 = new Address("SCGT"); // 添加地址2 person.getAddress().add(address2); // 持久化Address对象 session.persist(address2); transaction.commit(); } catch (Exception e) { transaction.rollback();// 回滚事务 e.getMessage(); } finally { if (session != null) { session.close(); } } }```![效果图片](http://img.blog.csdn.net/20160901225532760)----------**有连接表的1-N单向关联**----------Person.java<div class="se-preview-section-delimiter"></div>
package com.oneToMany;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name=”person_inf”)
public class Person {
@Id@Column(name="person_id")//name="person_id"@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String name;private int age;@OneToMany(targetEntity=Address.class)/* * @JoinTable(name="person_address", * //定义连接表中名为fk_person_id的外键列,该外键列参照当前实体对应的主键列 * joinColumns=@JoinColumn(name="fk_person_id" * ,referencedColumnName="person_id"), * //定义连接表中名为fk_address_id的外键列,该外键列参照当前实体关联实体对应的主键列 * inverseJoinColumns=@JoinColumn * (name="fk_address_id",referencedColumnName="address_id", unique=true)) * * @JoinTable注解映射fk_address_id外键列,添加了唯一约束,说明一个Address实体至多只能关联一个 * Person实体,而一个Person实体可以关联多个Address实体 * */@JoinTable(name="person_address", //定义连接表中名为fk_person_id的外键列,该外键列参照当前实体对应的主键列joinColumns=@JoinColumn(name="fk_person_id",referencedColumnName="person_id"), //定义连接表中名为fk_address_id的外键列,该外键列参照当前实体关联实体对应的主键列inverseJoinColumns=@JoinColumn(name="fk_address_id",referencedColumnName="address_id",unique=true))//N的一端以集合set形式出现private Set<Address> address=new HashSet<Address>();public Integer getId() { return id;}public void setId(Integer id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}public Set<Address> getAddress() { return address;}public void setAddress(Set<Address> address) { this.address = address;}
}
Address.java<div class="se-preview-section-delimiter"></div>
package com.oneToMany;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name=”address_inf”)//catalog=”hibernate_oneToMany”,name=”address_inf”
public class Address {
@Id@Column(name="address_id")//name="address_id"@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String addressDetail;public Address(){}public Address(String addressDetail ){ this.addressDetail=addressDetail; }public void setId(Integer id) { this.id = id;}public Integer getId() { return id;}public void setAddressDetail(String addressDetail) { this.addressDetail = addressDetail;}public String getAddressDetail() { return addressDetail;}
}
TestDemo.java<div class="se-preview-section-delimiter"></div>
public static void test2() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); SessionFactory factory = new MetadataSources(registry).buildMetadata() .buildSessionFactory(); // 获取Session Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); try { Person person = new Person(); // 持久化Person对象 session.save(person); Address address = new Address("GDUT"); person.setName("Jeff"); person.setAge(21); // 持久化Address对象 session.persist(address); // 添加地址1 person.getAddress().add(address); Address address2 = new Address("SCGT"); // 添加地址2 person.getAddress().add(address2); // 持久化Address对象 session.persist(address2); transaction.commit(); } catch (Exception e) { transaction.rollback();// 回滚事务 e.getMessage(); } finally { if (session != null) { session.close(); } }}
“`
通过上面两个例子,我们可以知道,对于采用连接表的单向1-N关联,由于采用连接表维护了关联关系,两个对应的数据表无需增加外键列,所以两个实体对应的数据表就没有主从表关系。程序可以想先持久化哪个实体就先持久化哪个实体,不会引发性能问题。
public static void test2() { StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); SessionFactory factory = new MetadataSources(registry).buildMetadata() .buildSessionFactory(); // 获取Session Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); try { Person person = new Person(); // 持久化Person对象 session.save(person); Address address = new Address("GDUT"); person.setName("Jeff"); person.setAge(21); // 持久化Address对象 session.persist(address); // 添加地址1 person.getAddress().add(address); Address address2 = new Address("SCGT"); // 添加地址2 person.getAddress().add(address2); // 持久化Address对象 session.persist(address2); transaction.commit(); } catch (Exception e) { transaction.rollback();// 回滚事务 e.getMessage(); } finally { if (session != null) { session.close(); } } }
通过图片知道,我们可以知道,对于采用连接表的单向1-N关联,由于采用连接表维护了关联关系,两个对应的数据表无需增加外键列,所以两个实体对应的数据表就没有主从表关系。程序可以想先持久化哪个实体就先持久化哪个实体,不会引发性能问题。对于没有连接表的关联来说,要想优化性能,在持久化Address类之前,我们需要给Address实体指定关联的实体,就是person.getAddress().add(address)。
- Hibernate 1-N单向关联(注解实现)
- Hibernate单向关联N-1
- Hibernate单向关联1-N
- Hibernate 单向N-1关联
- 【hibernate】关联映射那些事(一)---单向N-1关联与单向1-1关联
- 【hibernate】关联映射那些事(二)--单向1-N映射和单向N-N映射
- Hibernate单向关联N-N
- Hibernate的单向N-1关联(一)
- Hibernate的单向1-N关联(三)
- Hibernate的关联映射(1)-单向N-1关联
- Hibernate的关联映射(3)-单向1-N关联
- Hibernate的单向N-N关联(四)
- Hibernate学习随笔-----关系映射(1)单向N-1关联
- Hibernate关系映射1:单向N-1关联
- Hibernate单向1-N关联的简单示例
- Hibernate学习随笔-----关系映射(3)单向1-N关联
- Hibernate关联关系之——单向n-1
- hibernate注解方式单向一对多关联
- 手机自动化测试(9)--抓包手机数据
- No package php-mcrypt available 引发的yum源解决方法(安装php时出错)
- extern C 的作用
- iOS开发小结 - 关于swift中#if DEBUG判断不执行的解决方案
- Spring面试问答Top 25
- Hibernate 1-N单向关联(注解实现)
- 11,字符串
- POJ 1185 炮兵阵地
- 下载安装MySQL5.7.14记录
- RxJava初见之创建操作
- RegexBuddy使用教程
- 3.4.1 流量控制、可靠传输与滑动窗口机制
- C# TCP/UDP 通讯代码讲解
- 2016/9/1 【线性代数 + C++】求行列式数字结果的程序