这篇主要讲hiberante中的 单向一对多关联映射

1.在应用中,有时候需要从一的一端获取多的一端的数据。比如:查看某个分类下的所有书籍信息;查看某个订单下的所有商品等。

2.在一对多的关联关系中,表的设计为:

从表的设计中可以看出,表结构和多对一的表结构相同

3.类的设计

Book.java

public class Book implements Serializable{
private int id;
private String name;
private String author;
private double price;
private Date pubDate;
public Book() {
}
public Book(String name, String author, double price, Date pubDate) {
super();
this.name = name;
this.author = author;
this.price = price;
this.pubDate = pubDate;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Date getPubDate() {
return pubDate;
}
public void setPubDate(Date pubDate) {
this.pubDate = pubDate;
}
}

Category.java

public class Category implements Serializable{
private int id;
private String name;
private Set<Book> books = new HashSet<>();
public Category() {
} public Category(String name) {
super();
this.name = name;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public Set<Book> getBooks() {
return books;
} public void setBooks(Set<Book> books) {
this.books = books;
}
}

4.映射文件

Book.hbm.xml

<hibernate-mapping package="cn.sxt.pojo">
<class name="Book" table="t_book">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="author"/>
<property name="price"/>
<property name="pubDate"/>
</class>
</hibernate-mapping>

Category.hbm.xml

<hibernate-mapping package="cn.sxt.pojo">
<class name="Category" table="t_category">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!-- 一对多的关联映射 -->
<set name="books">
<!-- 指定外键的名称 -->
<key column="cid"></key>
<!-- 指定多的一端的类型 -->
<one-to-many class="Book"/>
</set>
</class>
</hibernate-mapping>

此处,如果package没写,class name=”cn.swy.pojo.Category”并且<one-to-many class=”cn.swy.pojo.Book”

5.测试

public class HibernateTest {
/**
* 生成数据库表的工具方法
* */
@Test
public void testCreateDB(){
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
//第一个参数 是否打印sql脚本
//第二个参数 是否将脚本导出到数据库中执行
se.create(true, true);
}
/**
* 初始化表数据
* 使用一对多的方式来保存数据,会执行update语句来更新外键
* 使得效率会比多对一的方式效率低
*/
@Test
public void testInit(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Category c1 = new Category("计算机类");
Category c2 = new Category("文学");
Category c3 = new Category("历史");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Book b1 = new Book("java","sun",30,df.parse("1995-05-23"));
Book b2 = new Book("struts","apache",40,df.parse("2006-09-12"));
Book b3 = new Book("明朝那些事儿","当年明月",70,df.parse("2008-05-23"));
Book b4 = new Book("水浒传","老撕",20,df.parse("1985-05-23"));
//设置关系
c1.getBooks().add(b1);
c1.getBooks().add(b2);
c2.getBooks().add(b4);
c3.getBooks().add(b3);
session.save(c1);
session.save(c2);
session.save(c3);
session.save(b1);
session.save(b2);
session.save(b3);
session.save(b4);
tx.commit(); } catch (Exception e) {
if(tx!=null)
tx.rollback();
}finally {
HibernateUtil.close();
}
}
/**
* 在查询一的一端数据时可以获取多的一端的数据
*/
@Test
public void testGetData(){
Session session = HibernateUtil.getSession();
Category c1 = (Category)session.get(Category.class, 1);
System.out.println(c1.getId()+"----"+c1.getName());
System.out.println("-----------------");
for(Book book:c1.getBooks()){
System.out.println(book);
}
HibernateUtil.close();
}
}

java之hibernate之单向的一对多关联映射的更多相关文章

  1. java之hibernate之单向的多对多关联映射

    这篇 单向的多对多关联映射 1.如何在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Permission.java public class Permission impl ...

  2. java之hibernate之双向的多对一关联映射

    这篇讲解 双向的多对一关联映射 1.表结构和多对一时,一致 2.类结构 Book.java public class Book implements Serializable{ private int ...

  3. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  4. 【SSH系列】Hibernate映射 -- 一对多关联映射

        映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个 ...

  5. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  6. 014 一对多关联映射 单向(one-to-many)

    在对象模型中,一对多的关联关系,使用集合来表示. 实例场景:班级对学生:Classes(班级)和Student(学生)之间是一对多的关系. 多对一.一对多的区别: 多对一关联映射:在多的端加入一个外键 ...

  7. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  8. Hibernate一对多关联映射的配置及其级联删除问题

    首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class Q ...

  9. hihernate一对多关联映射

    hihernate一对多关联映射 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端 ...

随机推荐

  1. 第12组 Beta冲刺(4/5)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...

  2. protobuf使用

    一.protobuf环境搭建 Github 地址: https://github.com/protocolbuffers/protobuf 然后进入下载页 https://github.com/pro ...

  3. Real-time Multiple People Tracking with Deeply Learned Candidate Selection and Person Re-identification

    Real-time Multiple People Tracking with Deeply Learned Candidate Selection and Person Re-identificat ...

  4. Windows10纯净原版系统安装方法

    原文:https://baijiahao.baidu.com/s?id=1626696368732676440&wfr=spider&for=pc 1.先来下载一个纯净的ISO系统安装 ...

  5. Qt QSplitter任意拆分窗口

    Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,本文章给出使用QSplitter分割窗口的例子. QSplitter 继承自QFrame,而QFrame又继承自QWidg ...

  6. CefSharp 提示 flash player is out of date 运行此插件 等问题解决办法

    CefSharp 提示 flash player is out of date 或者 需要手动右键点 运行此插件 脚本 等问题解决办法 因为中国版FlashPlayer变得Ad模式之后,只好用旧版本的 ...

  7. k8s记录-kubectl常用

    kubectl create/delete -f xxx.yml kubectl get all -A kubectl get pods -o wide kubectl describe pods p ...

  8. [LeetCode] 654. Maximum Binary Tree 最大二叉树

    Given an integer array with no duplicates. A maximum tree building on this array is defined as follo ...

  9. [LeetCode] 656. Coin Path 硬币路径

    Given an array A (index starts at 1) consisting of N integers: A1, A2, ..., AN and an integer B. The ...

  10. 【视频开发】四大图像库:OpenCV/FreeImage/CImg/CxImage

    1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法: 然后将图像格式和矩阵运算, ...