hibernate中对象集合的保存

Posted pclover11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate中对象集合的保存相关的知识,希望对你有一定的参考价值。

 

一、在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(50) NOT NULL,
depid INT,
FOREIGN KEY (depid) REFERENCES dept(id) ON DELETE CASCADE);

CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(100));

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;
    }
    
    

}
View Code

部门类

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;
    }
}
View Code

 

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中对象集合的保存的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的HQL多表查询

hibernate第一个例子-保存对象

hibernate--级联添加

如何使用 Hibernate 在内部保存带有集合的实体?

无法使用 Spring Data JPA / Hibernate 在事务中两次保存具有不可变集合的实体

Hibernate 入门 缓存机制