持久化类集合属性如何映射到数据库?

来源:互联网 发布:js 数组遍历 foreach 编辑:程序博客网 时间:2024/06/15 22:12

重点内容
1.List集合属性如何映射到数据库?
2.数组集合属性如何映射到数据库?
3.set集合属性如何映射到数据库?
4.Map集合如何映射到数据库?

问题1.处理List集合和数组集合的方法样,下面代码演示处理List集合属性映射:

1.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="connection.username">root</property>        <property name="connection.password">root</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>        <!-- 配置方言是非常重要!!!我这里配置的为MySQL5Dialect -->        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>        <!-- 配置C3P0连接池 -->        <property name="hibernate.c3p0.max_size">200</property>        <property name="hibernate.c3p0.min_size">2</property>        <property name="hibernate.c3p0.max_statements">50</property>        <property name="hibernate.c3p0.timeout"></property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <property name="hbm2ddl.auto">update</property>        <!-- 配置映射文件 -->        <property name="hibernate.current_session_context_class">thread</property>        <mapping  class="cn.codekong.entity.Students"/>    </session-factory></hibernate-configuration>2.使用JPA注解持Students类package cn.codekong.entity;import java.util.ArrayList;import java.util.List;import javax.persistence.CollectionTable;import javax.persistence.Column;import javax.persistence.ElementCollection;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.Table;@Entity //表示该类是一个持久化类@Table(name="studnets_info") public class Students{    @Id    @GeneratedValue     @Column(name="编号")    private int sid;    @Column(name="姓名")    private String name;    @Column(name="年龄")    private int age;    @ElementCollection(targetClass=String.class)//1.指定集合元素的数据类型    @CollectionTable(name="school_info",joinColumns=@JoinColumn(name="编号",nullable=false))    @Column(name="学校")    @OrderColumn(name="schools的索引")    private List <String>schools=new ArrayList<String>();    //必须写上无参构造方法    public Students(){    }    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    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;    }}3.测试import java.io.FileNotFoundException;import java.io.IOException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codekong.entity.Students;public class StudentsTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init() {        // 创建服务注册对象        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        // 创建会话工厂对象        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();        // 会话对象        session = sessionFactory.openSession();        // 开启事物        transaction = session.beginTransaction();    }    @After    public void destory() {        // 提交事物        transaction.commit();        // 关闭会话        session.close();        // 关闭会话工厂        sessionFactory.close();    }    @Test    public void testSaveStudentsPicture() throws FileNotFoundException, IOException {        Students s = new Students( );        s.setName("张三");        s.setAge(22);        s.getSchools().add("哈工大");        session.save(s);    }}Console输出结果:Hibernate:     alter table school_info        add constraint FKkgbq07qvscl1i52f3umc8l61u        foreign key (编号)        references studnets_info (编号)Hibernate:     select        next_val as id_val     from        hibernate_sequence for updateHibernate:     update        hibernate_sequence     set        next_val= ?     where        next_val=?Hibernate:     insert     into        studnets_info        (年龄, 姓名, 编号)     values        (?, ?, ?)Hibernate:     insert     into        school_info        (编号, 学校)     values        (?, ?)总结:映射List集合属性只需要4个JPA注解即可分别为:@ElementCollection(targetClass=String.class) @CollectionTable(name="school_info",joinColumns=@JoinColumn(name="编号",nullable=false))@Column(name="学校")@OrderColumn(name="schools的索引")

问题2.Set集合应为没有索引,因此不需要@OderColumn注解。所有将Set集合属性映射到底层数据库只需要3个注解即可。分别为:

@ElementCollection
@CollectionTable
@Column

代码如下:package cn.codekong.entity;import java.util.HashSet;import java.util.Set;import javax.persistence.CollectionTable;import javax.persistence.Column;import javax.persistence.ElementCollection;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.Table;@Entity //表示该类是一个持久化类@Table(name="studnets_info") public class Students{    @Id    @GeneratedValue     @Column(name="编号")    private int sid;    @Column(name="姓名")    private String name;    @Column(name="年龄")    private int age;    @ElementCollection(targetClass=String.class)//1.指定集合元素的数据类型    @CollectionTable(name="school_info",joinColumns=@JoinColumn(name="编号",nullable=false))    @Column(name="学校")    private Set <String>schools=new  HashSet<String>();    //必须写上无参构造方法    public Students(){    }    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    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 Set<String> getSchools() {        return schools;    }    public void setSchools(Set<String> schools) {        this.schools = schools;    }}

问题3.Map集合映射到数据库,5个JAP注解即可!分别为:
1.@ElementCollection(targetClass=数据类型.class):指定映射集合元素类型
2.@CollectionTable(name=”集合属性的表名”,joinColumns=@JoinColumn(name=”映射类的主键”,nullable=false)):集合元素映射对应的表名和外键
3.@Column(name=”Value值对应的字段名”):为value值添加字段名
4.@MapKeyClass(数据类型.class):key的数据类型
5.@MapKeyColumn(name=”KeyColumnName”):key值得字段名

1.持久化类代码演示:package cn.codekong.entity;import java.util.HashMap;import java.util.Map;import javax.persistence.CollectionTable;import javax.persistence.Column;import javax.persistence.ElementCollection;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.MapKeyClass;import javax.persistence.MapKeyColumn;import javax.persistence.Table;@Entity //表示该类是一个持久化类@Table(name="studnets_info") public class Students{    @Id    @GeneratedValue     @Column(name="编号")    private int sid;    @Column(name="姓名")    private String name;    @Column(name="年龄")    private int age;    @ElementCollection(targetClass=Float.class)//1.指定集合元素的数据类型    @CollectionTable(name="school_info",joinColumns=@JoinColumn(name="编号",nullable=false))    @Column(name="分数")    @MapKeyClass(String.class)    @MapKeyColumn(name="科目")    private Map<String,Float> scores=new HashMap<>();    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    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 Map<String, Float> getScores() {        return scores;    }    public void setScores(Map<String, Float> scores) {        this.scores = scores;    }}
2.测试import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codekong.entity.Students;public class StudentsTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init() {        // 创建服务注册对象        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        // 创建会话工厂对象        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();        // 会话对象        session = sessionFactory.openSession();        // 开启事物        transaction = session.beginTransaction();    }    @After    public void destory() {        // 提交事物        transaction.commit();        // 关闭会话        session.close();        // 关闭会话工厂        sessionFactory.close();    }    @Test    public void testSaveStudentsInfo() {        Students s = new Students();        s.setName("凯耐");        s.setAge(18);        s.getScores().put("离散数学", 88f);        session.save(s);    }}
控制台输出结果:Hibernate:     alter table school_info        add constraint FKkgbq07qvscl1i52f3umc8l61u        foreign key (编号)        references studnets_info (编号)Hibernate:     select        next_val as id_val     from        hibernate_sequence for updateHibernate:     update        hibernate_sequence     set        next_val= ?     where        next_val=?Hibernate:     insert     into        studnets_info        (年龄, 姓名, 编号)     values        (?, ?, ?)Hibernate:     insert     into        school_info        (编号, 科目, 分数)     values        (?, ?, ?)