hibernate的集合属性

本文深入探讨了使用Hibernate实现数据库映射与对象关系映射(ORM)的技术细节,包括如何定义实体类、配置Hibernate连接、操作数据库等关键步骤。详细介绍了Person类的属性设计、Person类与数据库表之间的映射关系、不同类型的属性如数组、集合、映射、集合等在Hibernate中的使用方式。并提供了一个完整的测试类实例,展示了如何通过Hibernate持久化对象到数据库,以及如何加载和操作数据库中的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List集合的属性

先创建一个Person类

package cn.hnpi.lis.entity;

import java.util.ArrayList;

import java.util.List;

public class Person {

private Integer id;

private String name;

private int age;

/**

* schools保持该person各阶段学校的信息

*/

private List<String> schools = new ArrayList<String>();

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public List<String> getSchools() {

return schools;

}

public void setSchools(List<String> schools) {

this.schools = schools;

}

}

在创建一个Person.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">

<!-- xml中书写提示:Alt+/ -->

<hibernate-mapping package="cn.hnpi.lis.entity">

<class name="Person" table="t_person">

<id name="id" column="person_id">

<generator class="native" />

</id>

<property name="age" />

<property name="name" />

<list name="schools" table="t_schools">

<!-- key系统会自动和person数据库表的主键进行管理,

他的字段名可以和person中主键的字段名不一样 -->

<key column="school_id"></key>

<list-index column="list_order" ></list-index>

<element type="string" column="school_name"></element>

</list>

</class>

</hibernate-mapping>

在src的目录下加入hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">123456</property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

<property name="hibernate.format_sql">true</property>

<property name="hibernate.show_sql">true</property>

<property name="hibernate.hbm2ddl.auto">update</property>

<!--<mapping resource="cn/hnpi/lis/entity/Person.hbm.xml" />

<mapping resource="cn/hnpi/lis/entity/Person2.hbm.xml" />

-->

<mapping resource="cn/hnpi/lis/entity/Person3.hbm.xml" />

<mapping resource="cn/hnpi/lis/entity/Person5.hbm.xml" />

<mapping resource="cn/hnpi/lis/entity/Person4.hbm.xml" />

</session-factory>

</hibernate-configuration>

写下测试类:

package cn.hnpi.lis.utils;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtil {

public static final SessionFactory sf;

static{

Configuration cfg = new Configuration().configure();

sf = cfg.buildSessionFactory();

}

public static Session getSession(){

return sf.openSession();

}

public static void closeSession(Session s){

if(s!=null){

s.close();

}

}

}

package cn.hnpi.lis.test;

import java.util.HashMap;

import java.util.Map;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import cn.hnpi.lis.entity.Person3;

import cn.hnpi.lis.entity.Person4;

import cn.hnpi.lis.entity.Person5;

import cn.hnpi.lis.utils.HibernateUtil;

public class MyTest3 {

Session session;

Transaction tx;

@Before

public void init(){

session = HibernateUtil.getSession();

tx = session.beginTransaction();

}

@After

public void close(){

tx.commit();

HibernateUtil.closeSession(session);

}

@Test

public void testPerson3(){

Person5 p5 = new Person5();

p5.setAge(22);

p5.setName("xiaohu");

p5.getSchools().add("小学");

p5.getSchools().add("中学");

p5.getSchools().add("大学");

session.persist(p5);

}

@Test

public void testPerson4(){

Person4 p5 = new Person4();

p5.setAge(20);

p5.setName("xiaohu");

Map<String, Float> score = new HashMap<String, Float>();

score.put("math", 236f);

score.put("math2", 2364f);

score.put("math3", 2363f);

p5.setScore(score);

session.persist(p5);

}

//

//

// @Test

// public void testLoad(){

// Person p3 = (Person) session.get(Person.class, 3);

// System.out.println(p3.getSchools().get(3));

//

// }

}

数组属性

private String[]schools;

<array name="schools" table="t_school2">

<key></key>

<list-index></list-index>

<element type="java.lang.String"></element>

</array>

SET的属性

private Set<String>schools = new HashSet<String>();

<hibernate-mapping package="cn.hnpi.lis.entity">

<class name="Person3" table="t_person3">

<id name="id" column="person_id">

<generator class="native" />

</id>

<property name="name" />

<property name="age" />

<set name="schools">

<key></key>

<element type="string" not-null="true"></element>

</set>

Map的属性:

private Map<String, Float> score = new HashMap<String, Float>();

<map name="score" table="score">

<key column="person_id" not-null="true"></key>

<map-key type="string" column="subject"></map-key>

<element column="grade" type="float"></element>

</map>

Collection的属性

private Collection<String> schools = new ArrayList<String>();

<bag name="schools">

<key column="person_id"></key>

<element type="string" column="school_name"></element>

</bag>

为了让hibernate根据<database-object>元素创建数据表,一定要将hibernate配置的文件里的hbm2ddl.auto的属性值修改成create

Hibernate提供的schemaExport工具

package cn.hnpi.lis.utils;

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

public class DataBaseTableInit {

public static void main(String[] args) {

Configuration cfg = new Configuration().configure();

SchemaExport export = new SchemaExport(cfg);

export.create(true, true);

}

}

注意的是在

<hibernate-mapping package="cn.hnpi.lis.entity.ch5_7_3" auto-import="false">

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值