Hibernate关联关系映射之一对多双向映射
一对多映射有两种,一种是单向的,另一种的多向。我们一般是使用双向的,所以我就写写一对多的双向映射。
还是想昨天一样举个例子来说明:作者《===》作品,还是对数据进行增删改查。
我们一般是把外键建立在多方的,一个作者对应多个作品。
这个前一篇的差不多。我就主要写写有差异的地方吧!
还是要建立数据库表,
- create table t_author(
- id bigint primary key auto_increment,
- authorName varchar(20)
- );
- create table t_book(
- id bigint primary key auto_increment,
- bookName varchar(20),
- fk_author_id int
- );
实体:
Author.java
- package com.cy.beans;
- import java.io.Serializable;
- import java.util.HashSet;
- import java.util.Set;
- public class Author implements Serializable {
- private static final long serialVersionUID = 1L;
- private long id;
- private String authorName;
- private Set<Book> books=new HashSet<Book>();
- public Author(){
- }
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getAuthorName() {
- return authorName;
- }
- public void setAuthorName(String authorName) {
- this.authorName = authorName;
- }
- public Set<Book> getBooks() {
- return books;
- }
- public void setBooks(Set<Book> books) {
- this.books = books;
- }
- @Override
- public String toString() {
- return "Author [id=" + id + ", authorName=" + authorName +
- ", books=" + books + "]";
- }
- }
Book.java
- package com.cy.beans;
- import java.io.Serializable;
- public class Book implements Serializable {
- private static final long serialVersionUID = 1L;
- private long id;
- private String bookName;
- private Author author;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getBookName() {
- return bookName;
- }
- public void setBookName(String bookName) {
- this.bookName = bookName;
- }
- public Author getAuthor() {
- return author;
- }
- public void setAuthor(Author author) {
- this.author = author;
- }
- @Override
- public String toString() {
- return "Book [id=" + id + ", bookName=" + bookName + ", author="
- + author + "]";
- }
- }
持久层和业务层都与之前的差不多。
主要映射文件有所改变:
主对象:Author.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.cy.beans.Author" table="t_author" catalog="j2ee"> <!-- catalog数据库 -->
- <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
- <column name="id"></column><!-- 此行的ID,为表字段ID -->
- <generator class="increment"></generator><!-- 给id指定生成策略 -->
- </id>
- <property name="authorName" type="java.lang.String">
- <column name="authorName"></column>
- </property>
- <!--lazy :lazy是延时的意思,如果lazy=true,那么就是说数据库中关联子表的信息在hibernate容器启动的时候不会加载,而是在你真正的访问到字表非标识字段的时候,才会去加载。
- 反之,如果lazy=false的话,就是说,子表的信息会同主表信息同时加载
- Hibernate3.x,lazy默认是true;
- -->
- <!-- inverse:hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系 -->
- <set name="books" table="t_book" cascade="all" inverse="true" lazy="false"><!-- set映射节点 -->
- <key column="fk_author_id"></key><!-- 外键 -->
- <one-to-many class="com.cy.beans.Book"/><!--one-to-mang节点 -->
- </set>
- </class>
- </hibernate-mapping>
从对象:Book.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.cy.beans.Book" table="t_book" catalog="j2ee"> <!-- catalog数据库 -->
- <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
- <column name="id"></column><!-- 此行的ID,为表字段ID -->
- <generator class="increment"></generator><!-- 给id指定生成策略 -->
- </id>
- <property name="bookName" type="java.lang.String">
- <column name="bookName"></column>
- </property>
- <!-- access:属性值读取方式field, property
- 1,property:这是默认值,表明hibernate通过set和get方法来访问类的属性。这是优先的推荐方式。你必须为这个属性设置get和set方法,hibernate才能访问到。否则会报错的。
- 2,field:表明hibernate通过java的反射机制直接访问类的属性。你可以不给这个属性设置get和set属性。 、
- fk_author_id :字段名;
- not-null :外键不为空
- author :many-to-one
- -->
- <many-to-one name="author" class="com.cy.beans.Author" cascade="none" access="property" column="fk_author_id" not-null="true"></many-to-one>
- </class>
- </hibernate-mapping>
在hibernate.cfg.xml里添加
- <mapping resource="com/cy/xmls/Book.hbm.xml"/>
- <mapping resource="com/cy/xmls/Author.hbm.xml"/>
测试:
- package com.cy.action;
- import java.util.HashSet;
- import java.util.Set;
- import com.cy.beans.Author;
- import com.cy.beans.Book;
- import com.cy.beans.Person;
- import com.cy.server.IAuthorServer;
- import com.cy.server.IPersonServer;
- import com.cy.server.impl.AuthorServerImpl;
- import com.cy.server.impl.PersonServerImpl;
- public class AuthorAction {
- public static void main(String[] args) {
- // saveAuthor(); 添加
- updateAuthor();//修改
- }
- private static void updateAuthor() {
- IAuthorServer ps=new AuthorServerImpl();
- Author p=ps.getAuthor(Author.class, Long.valueOf(1));//查询
- p.setAuthorName("1111");
- ps.updateAuthor(p);
- /*Hibernate:
- select
- author0_.id as id1_2_0_,
- author0_.authorName as authorNa2_2_0_
- from
- j2ee.t_author author0_
- where
- author0_.id=?
- 如果在Author.hbm.xml里没有设置lazy="false",那么下面这个select就不会执行
- Hibernate:
- select
- books0_.fk_author_id as fk_autho3_2_0_,
- books0_.id as id1_3_0_,
- books0_.id as id1_3_1_,
- books0_.bookName as bookName2_3_1_,
- books0_.fk_author_id as fk_autho3_3_1_
- from
- j2ee.t_book books0_
- where
- books0_.fk_author_id=?
- Hibernate:
- update
- j2ee.t_author
- set
- authorName=?
- where
- id=?
- Hibernate:
- update
- j2ee.t_book
- set
- bookName=?,
- fk_author_id=?
- where
- id=?*/
- }
- private static void saveAuthor() {
- Author a = new Author();
- Book b1 = new Book();
- Book b2 = new Book();
- a.setAuthorName("kitty");
- b1.setBookName("book1");
- b2.setBookName("book2");
- IAuthorServer server = new AuthorServerImpl();
- Set<Book> books = new HashSet<Book>();
- books.add(b2);
- books.add(b1);
- b1.setAuthor(a);
- b2.setAuthor(a);
- a.setBooks(books);
- server.saveAuthor(a);
- /*Hibernate:
- select
- max(id)
- from
- t_author
- Hibernate:
- select
- max(id)
- from
- t_book
- Hibernate:
- insert
- into
- j2ee.t_author
- (authorName, id)
- values
- (?, ?)
- Hibernate:
- insert
- into
- j2ee.t_book
- (bookName, fk_author_id, id)
- values
- (?, ?, ?)
- Hibernate:
- insert
- into
- j2ee.t_book
- (bookName, fk_author_id, id)
- values
- (?, ?, ?)*/
- }
- }
Hibernate关联关系映射之一对多双向映射的更多相关文章
- hibernate 映射<五>多对多双向映射
多对多映射,可以分单向映射和双向映射.无论是单向还是多向那一方维护,还是双方维护,生成的表结构是一样的. 订单order和产品product是对多对的关系,就是多个订单可以对应多个产品,多个产品也可以 ...
- hibernate 映射<四>多对一双向映射
学生和班级的例子来说,多个学生可以对应一个班级. 1.站在学生角度来说,学生就是多端.那么我们可以通过多对一来维护2者的关系. 2.站在班级的角度来说,班级就是一端.那么我们可以通过一对多啦维护2者的 ...
- Hibernate关联关系映射
1. Hibernate关联关系映射 1.1. one to one <class name="Person"> <id name="id" ...
- Hibernate(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...
- Hibernate(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- Hibernate 关联关系映射实例
双向多对一/一对多(many-to-one/one-to-many) 例子,多个学生对应一个班级,一个班级对应多个学生: 班级类,Grade.java: public class Grade { pr ...
- Hibernate学习笔记(四)关系映射之一对一关联映射
一. 一对一关联映射 ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 Ø 主键关联:即让 ...
随机推荐
- Android 如何通过浏览器打开App
首先给出参考资料http://my.oschina.net/liucundong/blog/354029?p=3#rpl_291191828 通过浏览器直接打开Android应用程序 Android ...
- codeforce 489d bfs分层处理
这个题确实没想到用bfs进行分层处理,后来看到了大佬的题解之后才想到了这一点 bfs dfs早就学了,可是还是不大会应用到这上面 可以分为三层,起始点,中间点,尾点,需要的数据是中间点到尾点的访问次数 ...
- ASP.NET Web API 框架研究 ASP.NET 路由
ASP.NET Web API 如果采用Web Host方式来寄宿,在请求进入Web API 消息处理管道之前,就会用ASP.NET 自身的路由系统根据注册的路由表,解析出当前请求的HttpContr ...
- 利用C#迭代器的一个杨辉三角示例
身边有个朋友在跟着廖雪峰的教程学习python,途中遇到了"在Python中使用迭代器打印杨辉三角"的问题,我在帮忙解决的同时顺手写了个简单的C#版本以供补充. internal ...
- UC浏览器 - 不负责任思考
前言 UC浏览器的辉煌应该是我读大学(2008年)的时候,转眼间,十年过去了,庆幸的是UC还在,我从使用者变成了一名UC的员工. 以下都是个人的不负责任的猜想或者思考 变更 塞班时代 UC浏览器的地位 ...
- 一步步改造wcf,数据加密传输-匿名客户端加密传输
一步步改造wcf,数据加密传输-匿名客户端加密传输 百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传 ...
- 背水一战 Windows 10 (48) - 控件(集合类): FlipView
[源码下载] 背水一战 Windows 10 (48) - 控件(集合类): FlipView 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类) FlipView 示例Fl ...
- 【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)
[前言]本文“严重参考” 自阮一峰老师写的ES6文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的 ...
- InfluxDB配置文件详解
全局配置 # 该选项用于上报influxdb的使用信息给InfluxData公司,默认值为false reporting-disabled = false # 备份恢复时使用,默认值为8088 bin ...
- Java - 基础起步
package basics; //声明该类所在的包为basics,package为包的关键字 import java.util.Date; //导入java.util包中的Date类,用来封装当前的 ...