一、在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. Sublime的中文GBK显示乱码的解决方法

    import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd ...

  2. Go:Hello World!

    备注 结束了一周紧张的工作,周末像品茶一样玩味一下Go,本文主要记录学习Go的经历. Go是什么? 官方网站:http://golang.org/. 在Windows下安装Go 官方教程:http:/ ...

  3. python笔记19-获取当前运行函数名称和类方法名称

    前言 写完代码之后,一般为了方便查看日志,可以在日志输出中加入当前运行的函数名称或类和方法名称,以便于代码报错的时候能快速找到报错的是哪个函数或方法. 那么如何获取当前运行函数(或方法)的名称呢? 获 ...

  4. [转]Oracle dblink调用函数报ORA-00904 标识符无效

    新建oracle的database link时,提示错误“ORA-12169: TNS: 指定为连接标识符的 Net 服务名太长”, 网上查了下,是因为目标oracle是集群,连接字符串过长,超过25 ...

  5. 深度学习文档 DeepLearning 0.1 documentation

    Contents LICENSE Deep Learning Tutorials Getting Started Download Datasets Notation A Primer on Supe ...

  6. INFORMATICA 的元数据管理之二:运行状态信息查询

    本项目里的两个哥们做的关于运行状态元数据的两个JOB挺酷的,最近一段时间运行状况良好,自己参考学习的同时以做日志记载,呵呵,为了节省笔墨,相关元数据表结构以及MAPPING设计之类不做介绍(如有疑问欢 ...

  7. Orchard运用 - 如何删除部分内容显示

    最近在潜心研究Orchard CMS,个人觉得要深入了解一个系统最好的办法, 就是使用它做些什么尝试,最好有些真实的实践,比如不妨基于Orchard搭建个人博客, 看看有哪些场景需要定制,哪些功能可以 ...

  8. kubernetes基础概念

    kubernetes是基于容器技术的分布式架构领先方案.具有完备的集群管理能力,包括多层次的安全防护和准入机制.多租户应用支撑能力.透明的服务注册和服务发现机制.内建智能负载均衡器.强大的故障发现和自 ...

  9. table 中,如何使得单元格的内容不换行,单元格不被撑开

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. PHP出现Notice警告怎么办

    如下所示,出现Notice警告 程序并没有大错,只是一些变量没有定义,你在代码的第一行加入这一句就可以了:error_reporting(E_ALL ^ E_NOTICE); 恢复正常了.