四、hibernate基础配置以及映射类型

指定表名:@Table(如果表名和实体名一样可以省略该注解)

 

指定字段名:@Column(如果字段名和实体属性一样可以省略该注解)

 

如果在属性上面没有添加@Transient注解,表明该属性需要映射,默认加上了@Basic注解

 

@Temporal:控制日期时间

 

@Enumerated(EnumType.STRING) 用于指定枚举

 

boolean型属性映射的问题

JPA Annotation能够自动创建表和字段,大多数类型和关联都能够良好地工作。但是在使用boolean类型的属性时,针对MySQL进行自动生成,将 生成为bit类型且长度为1的Field,然而这根本不能满足要求,甚至都不能正常工作,主要原因是JPA Annotation注解本身不支持boolean类型,因此有必要进行一定的修改来完成此项功能。 方法大体分为两种,第一种是使用Hibernate Annotation进行定义,第二种是使用getter/setter方法在存取时进行转换。

1、添加Hibernate Annotation

	@Column
	@org.hibernate.annotations.Type(type="yes_no")
	public Boolean getTest() {
		 return this.test;

	}



Hibernate的Type注记能更详细地标记字段的类型,在相应的boolean字段上进行标记后,重新生成表字段,这样就可以看到表中的字段已经变成了长度为1的char类型了。 则其他部分均无需改动。 此种方法最大的优点就是极其简单,改动代码较少。 然而缺点则是将原本可仅依赖于JPA的代码,增加了对Hibernate Annotation的依赖。

2、使用getter/setter方法 如果想避免方法一中的缺点,则可采用方法二。 方法二是添加一对getter/setter方法,如下:

        @Column(columnDefinition="char(1)")
	public Boolean getTest() {
		    if (test == null) return null;
		    return test == 'Y' ? Boolean.TRUE : Boolean.FALSE;
		  }

	public void setTest(Boolean test) {
		    if (test == null) {
		      this.test = null;
		    } else {
		      this.test = test == true ? 'Y' : 'N';
		    }
	}

如 此操作的话,就能够在对属性进行存取操作时,转换成对应的数据库字段值。由于操作已经得到很好的封装,因此也不会对外部的代码造成其他的影响,尤其是在系 统中还建有model层的时候,可根据领域模型属性直接定义为boolean类型。 此方法的优点是借助于JPA的实现无关性,可最大限度地跨框架使用。 缺点则是必须划分持久层和领域层的实体,持久导的实体属性使用Character类型,则领域层可直接使用boolean类型。

 

 

Hibernate几种映射类型

在我们学习Hibernate时就知道,Hibernate映射类型分为两种:Hibernate内置的映射类型和Hibernate客户化映射类型。
内置映射类型负责把一些常见的Java类型映射到相应的SQL类型;此外,Hibernate还允许用户实现UserType或CompositeUserType接口,来灵活地定制客户化映射类型
Hibernate内置映射类型
1).Java基本类型的Hibernate映射类型
 
Java 类型
Hibernate 映射类型
标准 SQL 类型
大小和取值范围
int/Integer
int/integer
INTEGER
4Byte
long/Long
long
BIGINT
8Byte
short/Short
short
SAMLLINT
2Byte
byte/Byte
byte
TINYINT
1Byte
float/Float
float
FLOAT
4Byte
double/Double
double
DOUBLE
8Byte
BigDecimal
big_decimal
NUMBERIC
Numeric(8,2)
char/Character/String
character
CHAR(1)
定长字符
String
string
VARCHAR
变长字符
boolean/Boolean
boolean
BIT
布尔类型
boolean/Boolean
yes/no
CHAR(1)('Y'/'N')
布尔类型
boolean/Boolean
true/false
CHAR(1)('T'/'F')
布尔类型
2). Java时间和日期类型的Hibernate映射类型
 
Java 类型
Hibernate 映射类型
标准 SQL 类型
描述
java.util.Date/java.sql.Date
date
DATE
日期, yyyy-mm-dd
java.util.Date/java.sql.TIme
time
TIME
时间, hh : mm : ss
java.util.Date/java.sql.Timestamp
timestamp
TIMESTAMP
时间戳, yyyymmddhhmmss
java.util.Calendar
calendar
TIMESTAMP
同上
java.util.Calendar
calendar_date
DATE
日期 yyyy - mm - dd
当程序类型为java.sql.Timestamp, 数据库中表属性类型为timestamp的情况下,即使用户以空值插入数据,数据库系统仍然会自动填充timestamp的值
3). Java 大对象类型的Hibernate映射类型
 
Java 类型
Hibernate 映射类型
标准 SQL 类型
MySql 类型
Oracle 类型
byte[]
binary
VARBINARY/BLOB
BLOB
BLOB
String
text
CLOB
TEXT
CLOB
serializable
实现 serializable 接口的一个 java 类
VARBINARY/BLOB
BLOB
BLOB
java.sql.Clob
clob
CLOB
TEXT
CLOB
java.sql.Blob
blob
BLOB
BLOB
BLOB
在应用程序中通过Hibernate来保存java.sql.Clob或者java.sql.Blob实例时,必须包含两个步骤:
a. 在一个数据库事务中先保存一个空的Blob或Clob实例;
b. 接着锁定这条记录,更新在步骤(1)中保存的Blob或Clob实例,把二进制数据或长文本数据写到Blob或Clob实例中。

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

Customer customer = new Customer();

customer.setDescription(Hibernate.createClob(""));

//先保存一个空的clobsession.save(customer);

session.flush(); //锁定这条记录

session.refresh(customer,LockMode.UPGRADE);

oracle.sql.CLOB clob = (oracle.sql.CLOB) customer.getDescription(); j

ava.io.Writer pw = clob.getCharacterOutStream();

pw.write(longText);//longText是一个长度超过255的字符串

pw.close(); tx.commit();

session.close();

 

 

一个java类型对应多个Hibernate映射类型的场合。例如,如果持久化类的属性为java.util.Date类型,对应的Hibernate映射类型可以是date,time或timestamp。此时必须根据对应的数据库表的字段的SQL类型,来确定Hibernate映射类型。如果字段为Date类型,则hibernate映射为datge,如果为TIME则为time,如果为TIMESTAMP则为timestamp。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值