一、在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多)

1需要进行如下步骤:

1) 设计数据表关系

2)引入jar包,需要注意引入数据库connector

3)写实体类

4)配置映射文件和hibernate.cfg.xml

2例子如下:

员工和部门的关系,多个员工属于一个部门,一个部门有多个员工。可以在员工表上设置一个外键解决一对多的关系。

2.1)创建表

CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR() NOT NULL,
depid INT,
FOREIGN KEY (depid) REFERENCES dept(id) ON DELETE CASCADE); CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR());

2.2)引入jar包

2.3)写实体类

员工类

public class Employee {
private int id;
private String ename;
private Dept dept = new Dept();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
} }

部门类

public class Dept {
private int id;
private String dname;
private Set<Employee> employees = new HashSet<Employee>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}

2.4)配置映射文件

部门映射文件,dept.hbm.xml

<hibernate-mapping
package="com.baidu.entity">
<class name="Dept" table="dept">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="dname" column="dname"></property> <set name="employees" table="emploee">
<key column="depid"></key>
<one-to-many class="Employee"/>
</set> </class>
</hibernate-mapping>

注意:在配置一对多的时候,部门对员工是一对多,要配置的内容set

1)集合属性是哪一个,employees

2)该集合属性存储对象对应的表,employee

3)该表的外键,depid

4)集合中存储对象的类型,class=Employee

员工映射文件,employee.hbm.xml

<hibernate-mapping
package="com.baidu.entity">
<class name="Employee" table="employee">
<id name="id" column="id">
<generator class="native"/>
</id> <property name="ename" column="ename"></property>
<many-to-one name="dept" class="Dept" column="depid"></many-to-one>
</class> </hibernate-mapping>

注意:在配置多对一的时候,员工对部门是多对一。要配置的内容many-to-one

1)哪个对象要映射

2)该表哪个外键与对象关联

3)映射对象的类型

全局配置hibernate.cfg.xml,可以查看之前博客hibernate开发流程

3 简单测试

public void fun1(){
Configuration configuration = new Configuration();
configuration.configure(); SessionFactory sessionFac = configuration.buildSessionFactory();
Session session = sessionFac.openSession();
Transaction bt = session.beginTransaction(); Dept dept = new Dept();
dept.setDname("test");
Employee employee = new Employee();
employee.setEname("test3");
employee.setDept(dept); Employee employee2 = new Employee();
employee2.setEname("test4");
employee2.setDept(dept); session.save(employee);
session.save(employee2);
session.save(dept); bt.commit(); session.close();
sessionFac.close(); }

需要说明的是

在表中是通过外键来表达一对多或多对一的关系;在类中是通过对象集合来表达,例如set/list/map;在配置文件中需要注意set/list/map的配置

哪一张表有外键就操作该表对应那个对象进行添加另外的对象,不然会出问题。

在hibernate中想要将一个对象映射成一个外键字段,只有many-to-one

在使用对象进行保存时,如果想要正确保存关联的对象时需要设置cascade属性为“save-update”,或者“all”

实体类中如果有类对象属性,要进行初始化,否则可能得不到正确结果。

hibernate中对象集合的保存的更多相关文章

  1. ORM进阶之Hibernate中对象的三大状态解析

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一 ...

  2. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  3. Hibernate中使用@Lob 注解保存String[] 问题

    Hibernate中使用@Lob 注解保存String[] 问题 在Hibernate注解中怎样你想保存一个字段为String数组类型.假设你想尝试保存为clob类型的话,普通情况下为定义为: @En ...

  4. hibernate 中对象的3种状态总结

    1.Hibernate把对象分文三种状态:Transient(临时状态).Persistent(持久化状态).Detached(游离状态). 1)Transient:刚刚new出来的对象,就是Tran ...

  5. hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Objec ...

  6. Hibernate中对象的3种状态:瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久 态的对象也称为PO(Persistence Objec ...

  7. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  8. hibernate中对象的3种状态----瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  9. hibernate 中多对多关系对象集合的保存

    多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...

随机推荐

  1. Percona-Toolkit学习之安装和配置

    http://blog.chinaunix.net/uid-26446098-id-3390779.html

  2. Fragment 简介 基础知识 总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. jQuery调用ajax获取json格式数据

    <body> <div>点击按钮获取音乐列表</div> <input type="button" id="button&quo ...

  4. 要点Java20 java.util.Collections

    java.util.Collections 集合帮助类 演示样例程序(JUnit演示) 排序 @Test public void testSort() { List<Integer> de ...

  5. Cognos TM1_10.1.1服务端安装

    出于对bi行业的强大热爱,出于对cognos tm1的强大兴趣,于是就想研究一下Cognos TM1(table manager one),今天就分享一下自己微不足道研究成果,真可谓是tm1的九牛一毛 ...

  6. Win下执行Swing程序的BAT文件 和 Linux下执行Swing程序的SH文件

    BAT文件: @echo off set CLASSPATH_BAK=%CLASSPATH% set classpath=%CLASSPATH%;.\lib\commons-codec-1.3.jar ...

  7. discuz,ecshop的伪静态规则(apache+nginx)

    discuz(nginx): (备注:该规则也适用于二级目录) rewrite ^([^\.]*)/topic-(.+)\.html$ $/portal.php?mod=topic&topic ...

  8. ejs和swig对比的问题之一

    本来想测试下两者在nodejs中得执行速度,设置了一个测试数据,如下 var testData = { title:'测试标题', description: '<p>这是一个描述,里面用很 ...

  9. ExplorerControls的显示问题

    我们都知道ArcGIS桌面版本"添加数据"的功能是弹出一选择对话框,如下图所示,但我们总想搞自己的,以便融入自己的风格.下图左边是ArcGIS自带的"添加数据" ...

  10. 一个完整的C++程序SpreadSheet - 1) 类的声明和定义

    1. SpreadsheetCell.h #pragma once #include <string> class SpreadsheetCell { public: void setVa ...