Java 在hibernate和Spring数据JPA中使用xml配置代替@Type注释
我的公司在一个遗留项目中使用了Java7和Hibernate3以及Spring3。所有spring和hibernate配置都在xml文件中,它们不使用注释 对于一些客户来说,数据库是oracle,而对于其他客户来说,数据库是db2 在oracle中,当数据类型为Date并且使用java.util.Date和time时会出现问题。当Hibernate准备查询时,问题位于绑定级别 java.util.Date转换为java.sql.Timestamp,并最终绑定到oracle.sql.Timestamp 我们的列具有oracle.sql.DATE类型,因此oracle中存在隐式转换以执行查询,从而导致不使用索引 我们的解决方案是在hibernate中使用UserTypes将Oracle数据库中的java日期转换为Oracle日期 但正如我所说的,我们使用xml配置,在使用hibernate和spring Jpa时,我找不到@Type注释的xml配置 带有日期类型logindate的person类代码:Java 在hibernate和Spring数据JPA中使用xml配置代替@Type注释,java,oracle,hibernate,spring-data-jpa,Java,Oracle,Hibernate,Spring Data Jpa,我的公司在一个遗留项目中使用了Java7和Hibernate3以及Spring3。所有spring和hibernate配置都在xml文件中,它们不使用注释 对于一些客户来说,数据库是oracle,而对于其他客户来说,数据库是db2 在oracle中,当数据类型为Date并且使用java.util.Date和time时会出现问题。当Hibernate准备查询时,问题位于绑定级别 java.util.Date转换为java.sql.Timestamp,并最终绑定到oracle.sql.Timesta
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.util.Date;
public class Person {
private Integer id;
private String fullName;
// @Type(type = "mypackage.OracleDate")
private Date loginDate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Date getLoginDate() {
return loginDate;
}
public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
}
OracleDate用户类型的代码:
public class OracleDate implements UserType {
private static final int[] SQL_TYPES = new int[] {
Types.TIMESTAMP
};
@Override
public int[] sqlTypes() {
return SQL_TYPES;
}
@Override
public Class returnedClass() {
return Date.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y) {
return true;
}
if (x == null || y == null) {
return false;
}
Date dtx = (Date) x;
Date dty = (Date) y;
return dtx.equals(dty);
}
@Override
public int hashCode(Object o) throws HibernateException {
return o.hashCode();
}
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {
Object timestamp = StandardBasicTypes.TIMESTAMP.nullSafeGet(resultSet, names, null, owner);
if (resultSet.wasNull())
return null;
if (timestamp == null) {
return null;
}
Date ts = (Date) timestamp;
return ts;
}
@Override
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
if (value == null) {
StandardBasicTypes.TIMESTAMP.nullSafeSet(preparedStatement, null, index);
} else {
Date ldt = ((Date) value);
preparedStatement.setObject(index, new DATE(new Timestamp(ldt.getTime())));
}
}
jpa bean:
<bean id="hostEntityManager"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="persistenceUnitManager" ref="persistenceUnitManager"></property>
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
</bean>
<bean id="persistenceUnitManager"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations" value="
classpath:PREPAID.CFG/DA.JPA/PERSISTENCE-ENTITIES/persistence.xml/>
<property name="persistenceUnitPostProcessors">
<bean class="mypackage.MergingPersistenceUnitPostProcessor" />
</property>
<property name="defaultDataSource" ref="dataSource"></property>
</bean>
首先,我想知道使用usertype是处理我的问题的最佳解决方案吗
在给定的情况下,当您将日期与时间一起存储,并且别无选择,只能将其存储在日期内时,很可能是这样。(请注意,一些参考资料,比如说,使用时间戳应该可以,而且它甚至不会产生更大的索引。)
TypeDef和类型注释的xml配置是什么
如果您不能在实体上使用注释,我今天只能看到以下可能性:
A) 使用标准的Hibernate映射XML
前提条件:您必须将JPA XML映射迁移到Hibernate本机格式
将以下内容添加到共享映射XML:
<typedef class="com.company.OracleDate" name="OracleDate" />
<property name="loginDate" type="OracleDate" />
<convert converter="com.company.OracleDateConverter" attribute-name="loginDate" />
,
不是直接的答案,但我会使用Oracle时间戳类型:
-
时间戳(分数秒精度)年、月和日值
日期以及时间的小时、分钟和秒值,其中
分数秒精度
可选择指定位数
在第二个日期时间字段的小数部分,可以是
数字范围在0到9之间。默认值为6。例如,您可以指定
时间戳
作为文字,如下所示:
TIMESTAMP'1997-01-3109:26:50.124'
请按照问题进行操作以供参考。您好,我不清楚您进行数据类型转换的原因。请你把问题的那一部分改一下好吗?即第二段。您保存到数据库的内容与从数据库中获得的内容,数据库中实际的列类型是什么,索引有什么问题…@PetrBodnár我编辑了我的问题以澄清问题。这里有一篇文章表达了同样的问题,谢谢,这样更好:)我想你也可以直接从你的问题链接到这篇文章。。。
<property name="loginDate" type="OracleDate" />
<convert converter="com.company.OracleDateConverter" attribute-name="loginDate" />