一对多映射有两种,一种是单向的,另一种的多向。我们一般是使用双向的,所以我就写写一对多的双向映射。

还是想昨天一样举个例子来说明:作者《===》作品,还是对数据进行增删改查。

我们一般是把外键建立在多方的,一个作者对应多个作品。

这个前一篇的差不多。我就主要写写有差异的地方吧!

还是要建立数据库表,

 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关联关系映射之一对多双向映射的更多相关文章

  1. hibernate 映射<五>多对多双向映射

    多对多映射,可以分单向映射和双向映射.无论是单向还是多向那一方维护,还是双方维护,生成的表结构是一样的. 订单order和产品product是对多对的关系,就是多个订单可以对应多个产品,多个产品也可以 ...

  2. hibernate 映射<四>多对一双向映射

    学生和班级的例子来说,多个学生可以对应一个班级. 1.站在学生角度来说,学生就是多端.那么我们可以通过多对一来维护2者的关系. 2.站在班级的角度来说,班级就是一端.那么我们可以通过一对多啦维护2者的 ...

  3. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  4. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  5. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  6. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  7. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

  8. Hibernate 关联关系映射实例

    双向多对一/一对多(many-to-one/one-to-many) 例子,多个学生对应一个班级,一个班级对应多个学生: 班级类,Grade.java: public class Grade { pr ...

  9. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

随机推荐

  1. OpenGL中的常用绘图的命令与效果(经验设置)

    1. 剔除多边形表面 在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡.如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们 ...

  2. VS2010与VS2013中的多字节编码与Unicode编码问题

    1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...

  3. hdu 4970 trick

    http://acm.hdu.edu.cn/showproblem.php?pid=4970 有n个格子在一条线标号1-n上,可以给范围在l到r内的格子架上攻击力为d的攻击塔,有m个怪物,每个怪物有个 ...

  4. 64位进程调用32位dll的解决方法

    64位进程调用32位dll的解决方法   最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/ ...

  5. cxRichEdit1获取EXCEL的区域图片

    cxRichEdit1获取EXCEL的区域图片   搞了好久却原来其实太简单: cxRichEdit1.Clear;Clipboard.Clear;ActiveSheet.cells[2, iCol] ...

  6. Android-Version Compatibility Issues (Gradle 2.14.1 requires Android Gradle plugin 2.1.3 (or newer)) but project is using

      当AndroidStudio加载工程Project的时候,出现以上错误❌,千万不要点击,否则就是更多其他的错误:   解决方案: 1.认真翻译错误: 2.分析问题发生的原因,然后看到了 ..... ...

  7. node-webkit学习(4)Native UI API 之window

    node-webkit学习(4)Native UI API 之window 文/玄魂 目录 node-webkit学习(4)Native UI API 之window 前言 4.1  window a ...

  8. 使用更改跟踪(ChangeTracking)来实现数据类型变更

    在现实场景中,我们经常会遇到修改数据类型的场景,尤其是自增列从INT修改为BIGINT的情况,自增列又通常作为表的主键和聚集索引键,因此修改操作需要按以下步骤来进行 1. 停止对该表的访问(通过禁用权 ...

  9. CentOS7下让Asp.Net Core的网站自动运行

    一.安装Nginx yum install nginx 二.配置Nginx vi /etc/nginx/nginx.conf location / { proxy_pass http://127.0. ...

  10. 作业调度系统quartz.net

    任务调度在我们日常开发过程中非常常见,比如:每天晚上0点自动执行某某操作:每周三晚上2点执行某某操作:......当然,我们处理这类问题的方法也有很多,比如:sql的自动任务:windows上创建任务 ...