【1】常见的映射关系表
常见的映射对应关系如下表所示:
【2】Java时间和日期类型的Hibernate映射
在 Java 中, 代表时间和日期的类型包括: java.util.Date 和 java.util.Calendar。
此外, 在 JDBC API 中还提供了 3 个扩展了 java.util.Date 类的子类: java.sql.Date, java.sql.Time 和 java.sql.Timestamp, 这三个类分别和标准 SQL 类型中的 DATE, TIME 和 TIMESTAMP 类型对应。因此在Java类中通常都将Date类型设置为java.util.Date。
在标准 SQL 中, DATE 类型表示日期, TIME 类型表示时间, TIMESTAMP 类型表示时间戳, 同时包含日期和时间信息。
映射类型 | Java类型 | 标准SQL类型 | 描述(java中表示) |
date | java.util.Date/java.sql.Date | DATE | 日期:yyyy-MM-dd |
time | java.util.Date/java.sql.Time | TIME | 时间 :HH:mm:ss |
timestamp | java.util.Date/java.util.Timestamp | TIMESTAMP | 日期和时间:yyyy-MM-dd HH:mm:ss |
calendar | java.util.Calendar | TIMESTAMP | 同上 |
calendar_dar | java.util.Calendar | DATE | 日期:yyyy-MM-dd |
如何把java.util.Date映射为DATE , TIME和TIMESTAMP?
一个 Java 类型可能对应多个 Hibernate 映射类型。 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp。
此时可以根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射类型。
如果字段为 DATE 类型, 那么 Hibernate 映射类型为 date; 如果字段为 TIME 类型, 那么 Hibernate 映射类型为 time; 如果字段为 TIMESTATMP 类型, 那么 Hibernate 映射类型为 timestamp。
当然也可以在XML中显示指定Hibernate映射类型如下所示:
不同类型日期时间在Java中的表示
java.sql.Time和java.sql.Date如上表所示,格式为:
HH:mm:ss yyyy-MM-dd
但是java.util.Date和java.sql.Timestamp就有些细节要注意了:
//数据库 datetime类型和timestamp类型 2018-10-05 16:13:46 2018-10-10 09:58:23 //Java显示 java.util.Date和java.sql.Timestamp date=2018-10-05 16:13:46.0 timestamp=2018-10-10 09:58:23.0
后面会多一个小数位秒,称之为纳秒,具体可以查看java.util.Date和java.sql.Timestamp源码。
尤其是如果数据库为date类型,Java对应接收类型为java.util.Date,就更有意思了:
//数据库 date类型 2018-10-05 // Java java.util.Date类型 date=2018-10-05 00:00:00.0
会自动给你补上00:00:00
!
【3】Java 大对象类型的 Hiberante 映射
① 几个概念
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据。
此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应。 CLOB 表示字符串大对象(Character Large Object), BLOB表示二进制对象(Binary Large Object)。
映射类型 | Java类型 | 标准SQL类型 | MySQL类型 | Oracle类型 |
binary | byte[] | VARCHAR/BLOB | BLOB | BLOB |
text | java.lang.String | CLOB | TEXT | CLOB |
clob | java.sql.Clob | CLOB | TEXT | CLOB |
blob | java.sql.Blob | BLOB | BLOB | BLOB |
MySQL不支持标准 SQL 的 CLOB 类型, 在 MySQL 中, 用 TEXT, MEDIUMTEXT 及 LONGTEXT 类型来表示长度超过 255 的长文本数据。
在持久化类中, 二进制大对象可以声明为 byte[] 或 java.sql.Blob 类型; 字符串可以声明为 java.lang.String 或 java.sql.Clob。
实际上在 Java 应用程序中处理长度超过 255 的字符串, 使用 java.lang.String 比 java.sql.Clob 更方便。
② 实例测试
- 在pojo中添加blob属性字段:
public class News { private Integer id; //field private String title; private String author; private String describle; private Date date; //使用 title + "," + content 可以来描述当前的 News 记录. //即 title + "," + content 可以作为 News 的 describle 属性值 //大文本 private String content; private Blob picture; //... }
- News.hbm.xml:
<property name="picture" type="java.sql.Blob"> <column name="PICTURE" default="null" /> </property>
- 测试代码如下:
@Test public void testBlob() throws Exception{ News news = new News(); news.setAuthor("cc"); news.setContent("CONTENT"); news.setDate(new Date()); news.setDescrible("DESC"); news.setTitle("CC"); InputStream stream = new FileInputStream("1.jpg"); Blob image = Hibernate.getLobCreator(session) .createBlob(stream, stream.available()); news.setPicture(image); session.save(news); System.out.println(news); }
- 测试结果如下:
Hibernate: insert into NEWS (TITLE, AUTHOR, DATE, CONTENT, PICTURE) values (?, ?, ?, ?, ?) News [id=10, title=CC, author=cc, describle=DESC, date=Mon Oct 08 12:17:24 CST 2018, content=CONTENT, picture=org.hibernate.engine.jdbc.BlobProxy@28c88600] //注意,这里picture为Blob代理对象
- 数据表效果如下:
另外,若希望精确映射 SQL 类型, 可以使用 sql-type 属性:
<!-- 映射大对象 --> <property name="content"> <column name="CONTENT" sql-type="mediumtext"></column> </property> <property name="picture"> <column name="PICTURE" sql-type="mediumblob"></column> </property>