持久化类集合属性如何映射到数据库?
来源:互联网 发布: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&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 (?, ?, ?)
阅读全文
0 0
- 持久化类集合属性如何映射到数据库?
- 如何将持久化类中集合属性为组件映射到底层数据库?
- hibernate映射集合属性(属性内非持久化类)
- 说说 Hibernate 如何映射持久化类
- 如何将对象持久化到数据库中BLOB
- jena持久化到数据库
- hibernate映射组件属性(组件属性为类但是不是持久化类)
- Hibernate如何配置实体类到数据库表的映射
- hibernate映射集合属性
- Hibernate集合属性映射
- Hibernate映射集合属性
- ActiveMQ 消息持久化到数据库
- tomcat持久化会话到oracl数据库
- ActiveMQ将消息持久化到数据库
- Apache ActiveMQ 持久化到MySQL数据库
- ActiveMQ消息持久化到Mysql数据库
- acticeMq持久化到mysql数据库配置
- activeMQ将消息持久化到数据库
- jquery下拉菜单怎么做,一个简单的纯手写例子
- English story 17
- bootstrap datatimepicker 兼容问题
- leetcode--Construct Binary Tree from Inorder and Postorder Traversal
- 九的余数
- 持久化类集合属性如何映射到数据库?
- iOS 开发中导航栏渐变的两种方法
- Kotlin&Anko基础教程大全 二
- python list去重
- AndroidStudio+Genymotion(附破解方法)安卓开发环境搭建
- js中的循环结构
- leetcode--Convert Sorted List to Binary Search Tree
- 剑指offer-序列化二叉树
- java分割字符串split()使用需注意的地方,转义字符使用