Hibernate的单向1-N关联(三)
来源:互联网 发布:关于烟的网络歌曲 编辑:程序博客网 时间:2024/05/22 01:40
1. 无连接表的单向1-N关联
对于无连接表的1-N单向关联而言,同样需要在N的一端增加外键列来维护关联关系,但由于程序此时只让1的一端来控制关联关系,因此直接在1的一端使用@JoinColumn修饰Set集合属性、映射外键即可。下面程序中一个Person实体可以关联多个Address实体。
@Entity@Table(name="person_inf")public class Person{// 标识属性@Id @Column(name="person_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String name;private int age;// 定义该Person实体所有关联的Address实体,没有指定cascade属性@OneToMany(targetEntity=Address.class)// 映射外键列,此处映射的外键列将会添加到关联实体对应的数据表中@JoinColumn(name="person_id" , referencedColumnName="person_id")private Set<Address> addresses= new HashSet<>();// id的setter和getter方法public void setId(Integer id){this.id = id;}public Integer getId(){return this.id;}// name的setter和getter方法public void setName(String name){this.name = name;}public String getName(){return this.name;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// addresses的setter和getter方法public void setAddresses(Set<Address> addresses){this.addresses = addresses;}public Set<Address> getAddresses(){return this.addresses;}}
下面是Address实体的代码。
@Entity@Table(name="address_inf")public class Address{// 标识属性@Id @Column(name="address_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private int addressId;// 定义地址详细信息的成员变量private String addressDetail;// 无参数的构造器public Address(){}// 初始化全部成员变量的构造器public Address(String addressDetail){this.addressDetail = addressDetail;}// addressId的setter和getter方法public void setAddressId(int addressId){this.addressId = addressId;}public int getAddressId(){return this.addressId;}// addressDetail的setter和getter方法public void setAddressDetail(String addressDetail){this.addressDetail = addressDetail;}public String getAddressDetail(){return this.addressDetail;}}
用下面的程序来保存Person和Address的对象。
public class PersonManager{public static void main(String[] args){PersonManager mgr = new PersonManager();mgr.testPerson();HibernateUtil.sessionFactory.close();}private void testPerson(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();// 创建一个Person对象Person p = new Person();// 创建一个瞬态的Address对象Address a = new Address("广州天河");// 必须先持久化Address对象session.persist(a); // ①// 设置Person的name为owen.org字符串p.setName("owen.org");p.setAge(21);// 设置Person和Address之间的关联关系p.getAddresses().add(a);// 持久化Person对象session.save(p);// 创建一个瞬态的Address对象Address a2 = new Address("上海虹口");// 必须先持久化Address对象session.persist(a2); // ②// 修改持久化状态的Person对象p.getAddresses().add(a2);tx.commit();HibernateUtil.closeSession();}}
上面的代码都已经给出了注释,读者可以自己出解读。而执行的SQL语言如下:
Hibernate: insert into address_inf (addressDetail) values (?)Hibernate: insert into person_inf (age, name) values (?, ?)Hibernate: insert into address_inf (addressDetail) values (?)Hibernate: update address_inf set person_id=? where address_id=?Hibernate: update address_inf set person_id=? where address_id=?
执行的结果图如下。
2. 有连接表的单向1-N关联
对于有连接表的1-N关联,同样需要使用@OneToMany修饰代表表关联实体的集合。除此之外,程序还应该使用@JoinTable显式指定连接表。下面Person类使用了@OneToMany、@JoinTable修饰代表关联实体的集合属性。
@Entity@Table(name="person_inf")public class Person{// 标识属性@Id @Column(name="person_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String name;private int age;// 定义该Person实体所有关联的Address实体@OneToMany(targetEntity=Address.class)// 映射连接表为person_address@JoinTable(name="person_address",// 定义连接表中名为person_id的外键列,该外键列参照当前实体对应表的主键列joinColumns=@JoinColumn(name="person_id", referencedColumnName="person_id"),// 定义连接表中名为address_id的外键列,// 该外键列参照当前实体的关联实体对应表的主键列inverseJoinColumns=@JoinColumn(name="address_id", referencedColumnName="address_id", unique=true))private Set<Address> addresses= new HashSet<>();// id的setter和getter方法public void setId(Integer id){this.id = id;}public Integer getId(){return this.id;}// name的setter和getter方法public void setName(String name){this.name = name;}public String getName(){return this.name;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// addresses的setter和getter方法public void setAddresses(Set<Address> addresses){this.addresses = addresses;}public Set<Address> getAddresses(){return this.addresses;}}
用到的Address和保存对象用的执行类如下。
public class PersonManager{public static void main(String[] args){PersonManager mgr = new PersonManager();mgr.testPerson();HibernateUtil.sessionFactory.close();}private void testPerson(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();// 创建一个瞬态的Person对象Person p = new Person();// 设置Person的name为owen.org字符串p.setName("owen.org");p.setAge(21);// 创建一个瞬态的Address对象Address a = new Address("广州天河");// 设置Person和Address之间的关联关系p.getAddresses().add(a);// 创建一个瞬态的Address对象Address a2 = new Address("上海虹口");// 设置Person和Address之间的关联关系p.getAddresses().add(a2);// 由于采用了连接表来维护1-N关联关系,因此不存在主从表关系,// 程序可以随意控制先持久化哪个实体。// 持久化Address对象session.persist(a2);// 持久化Person对象session.save(p);// 持久化Address对象session.persist(a);tx.commit();HibernateUtil.closeSession();}}
后台生成的SQL语言如下:
Hibernate: insert into address_inf (addressDetail) values (?)Hibernate: insert into person_inf (age, name) values (?, ?)Hibernate: insert into address_inf (addressDetail) values (?)Hibernate: insert into person_address (person_id, address_id) values (?, ?)Hibernate: insert into person_address (person_id, address_id) values (?, ?)
执行的结果如下。
0 0
- Hibernate的单向1-N关联(三)
- Hibernate单向关联N-1
- Hibernate单向关联1-N
- Hibernate 单向N-1关联
- Hibernate的关联映射(1)-单向N-1关联
- Hibernate的关联映射(3)-单向1-N关联
- Hibernate单向1-N关联的简单示例
- Hibernate的单向N-1关联(一)
- Hibernate的关联映射(4)-单向N-N关联
- Hibernate单向关联N-N
- Hibernate的单向N-N关联(四)
- 【hibernate】关联映射那些事(一)---单向N-1关联与单向1-1关联
- 【hibernate】关联映射那些事(二)--单向1-N映射和单向N-N映射
- Hibernate学习随笔-----关系映射(1)单向N-1关联
- Hibernate关系映射1:单向N-1关联
- Hibernate学习随笔-----关系映射(3)单向1-N关联
- Hibernate关联关系之——单向n-1
- Hibernate 1-N单向关联(注解实现)
- nodejs-express-ejs-mongodb-mongoose 错误锦集
- 稀疏表示与匹配追踪
- Android Studio Service 介绍
- C++第一次上机实验
- Android NDK环境搭建
- Hibernate的单向1-N关联(三)
- ViewPage 在xml中引用,报出ClassNotFoundException
- 【程序员必备】sql语句大全
- hihoCoder Floyd算法
- 两份MySQL的配置
- 0x09 文本相似性,词袋向量化
- Java 模拟Ajax上传文件
- array和list的排序算法对比(一):快速排序
- 策略模式