Hibernate的单向关联映射应用
2017-12-25 22:37
399 查看
一、简述
二、简单例子
1、数据库表
2、实体
3、测试类
一、单向N-1关联 单向N-1关系,比如多个人对应一个地址,只需从人实体端可以找到对应的地址实体,无须关系某个地址的全部住户。 单向 n-1 关联只需从 n 的一端可以访问 1 的一端。 二、单向1-1关联 从持久化的代码上看,单向1-1与单向N-1没有丝毫区别。 三、N-N关系 持久化类里需要使用集合属性,此时集合里的元素是关联实体
二、简单例子
1、数据库表
person表: CREATE TABLE `person` ( `personId` int(50) NOT NULL AUTO_INCREMENT, `personName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `personAge` int(50) DEFAULT NULL, `addressId` int(11) DEFAULT NULL, PRIMARY KEY (`personId`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci address表: CREATE TABLE `address` ( `addressId` int(50) NOT NULL AUTO_INCREMENT, `addressDetail` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`addressId`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci person_address表: CREATE TABLE `person_address` ( `addressId` int(50) NOT NULL AUTO_INCREMENT, `personId` int(50) DEFAULT NULL, PRIMARY KEY (`addressId`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
2、实体
package com; 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.ManyToMany; import javax.persistence.Table; import org.hibernate.annotations.Cascade; @Entity @Table(name="person") public class Person { @Id @Column(name="personId") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer personId; @Column(name="personName") private String personName; @Column(name="personAge") private Integer personAge; //----------------单向N-1关联Begin-------------// //========无连接表(中间表)的N-1关联===========// // //定义该Person实体关联的Address实体 // @ManyToOne(targetEntity=Address.class) // //映射外键列,指定外键列的列名为addressId // @JoinColumn(name="addressId",nullable=false) // @Cascade(CascadeType.ALL) //========有连接表(中间表)的N-1关系============// //定义该Person实体关联的Address实体 // @ManyToOne(targetEntity=Address.class) // //显式使用@joinTable映射连接表 // @JoinTable(name="person_address",//指定连接表的表名为person_address // //指定连接表中personId外键列,参考当前 实体对应表的主键列 // joinColumns=@JoinColumn(name="personId",referencedColumnName="personId",unique=true), // //指定连接表中addressId外键列,参照当前实体 关联实体 对应表的主键列 // inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId") // ) // @Cascade(CascadeType.ALL) //-----------------单向N-1关联END----------------// //-----------------单向1-1关联Begin------------------// //==================基于外键的单向1-1关联===============// //定义该person实体关联的Address实体 // @OneToOne(targetEntity=Address.class) // //映射名为addressId的外键列,参照关联实体对应表addressId主键列 // @JoinColumn(name="addressId", // //指定连接表中addressId外键列,参照当前实体关联实体对应表的主键列 // referencedColumnName="addressId",unique=true) // @Cascade(CascadeType.ALL) //===================有连接表(中间表)的1-1关联============// // @OneToOne(targetEntity=Address.class) // @JoinTable(name="person_address",//指定连接表的表名为person_address // //用于配置连接表中外键列信息,这些外键列参照当前实体对应表的主键列 // joinColumns=@JoinColumn(name="personId",referencedColumnName="personId",unique=true), // //用于配置连接表中外键列信息,这些外键列参照当前实体关联实体对应的主键列 // inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId",unique=true) // ) // @Cascade(CascadeType.ALL) //=====================单向1-1关联End==================// //=====================单向N-N关联=====================// //定义该Person实体所有关联的Address实体 @ManyToMany(targetEntity=Address.class) //映射链接表为person_address @JoinTable(name="person_address", //定义连接表中名为person_id的外键列,该外键参照当前实体对应的主键列 joinColumns=@JoinColumn(name="personId",referencedColumnName="personId"), //定义连接表中名为address_id的外键列,该外键列参照当前实体关联实体对应表的主键列,没有指定unique=true inverseJoinColumns=@JoinColumn(name="addressId",referencedColumnName="addressId") ) @Cascade(org.hibernate.annotations.CascadeType.ALL) //======================单向N-N关联End====================// private Set<Address> addresses=new HashSet(); /** * * // private Address address; // public Address getAddress() { // return address; // } // public void setAddress(Address address) { // this.address = address; // } * * @return */ public Integer getPersonId() { return personId; } public void setPersonId(Integer personId) { this.personId = personId; } @Column(name="personName") public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; } @Column(name="personAge") public Integer getPersonAge() { return personAge; } public void setPersonAge(Integer personAge) { this.personAge = personAge; } public Set<Address> getAddresses() { return addresses; } public void setAddresses(Set<Address> addresses) { this.addresses = addresses; } } package com; 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") public class Address { @Id @Column(name="addressId") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer addressId; private String addressDetail; public Address(){ } public Address(String addressDetail){ this.addressDetail=addressDetail; } public Integer getAddressId() { return addressId; } public void setAddressId(Integer addressId) { this.addressId = addressId; } @Column(name="addressDetail") public String getAddressDetail() { return addressDetail; } public void setAddressDetail(String addressDetail) { this.addressDetail = addressDetail; } }
3、测试类
package com; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class TestPerson { public static void main(String[] args) { Configuration config=new Configuration().configure(); SessionFactory sfy=config.buildSessionFactory(); Session session=sfy.openSession(); Transaction tx=session.beginTransaction(); Person p=new Person(); Address a=new Address("茂名市茂南区N_N有连接表"); p.setPersonName("person_N_N有连接关联"); p.setPersonAge(25); // p.setAddress(a); //持久化person对象 session.persist(p); Address a2=new Address("茂名市化州市N_N有连接关联"); //修改持久状态的p2 //p.setAddress(a2); Set<Address> addresses=new HashSet<Address>(); addresses.add(a); addresses.add(a2); p.setAddresses(addresses); tx.commit(); session.close(); sfy.close(); } }
相关文章推荐
- 【HIbernate框架学习】:Hibernate对象关系映射之单向多对一关联映射
- Hibernate关系映射级别注解(一对一单向外键关联)
- hibernate之关于一对一单向,双向关联映射
- Hibernate 单向的一对多关联映射
- Hibernate实体关系映射:单向主键一对一关联
- 【hibernate】关联映射那些事(二)--单向1-N映射和单向N-N映射
- Hibernate关联映射之-单向多对一关联(连接表)
- Hibernate一对一外键关联映射(单向)
- hibernate一对一唯一外键关联映射(单向关联Person----->IdCard)
- Hibernate基于主键和外键的单向一对一的关联映射
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- Hibernate映射——一对一单向关联映射(五)
- [置顶] Hibernate从入门到精通(十)多对多单向关联映射
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- hibernate之关于一对一单向,双向关联映射
- ORM框架Hibernate (四) 一对一单向、双向关联映射
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
- Hibernate几种关系映射总结(单向关联)
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
- Hibernate映射一对多单向关联(之一)