我的公司在一个遗留项目中使用Java7、Hibernate3和Spring3。所有spring和hibernate配置都在xml文件中,它们不使用注释。
对于一些客户,数据库是oracle,而对于其他客户,数据库是DB2。
在oracle中,当数据类型为Date时,我们会遇到问题,我们使用java.util.Date和Time。当Hibernate准备查询时,问题位于绑定级别。
具有日期类型的logindate的person类的代码:
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>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd ">
<persistence-unit name="system_persistence_unit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<mapping-file>TESTAPPLICATION/CFG/DA/JPA/PERSISTENCE-ENTITIES/person.xml</mapping-file>
<class>mypackage.Person</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="show_sql" value="true"/>
<property name="hibernate.archive.autodetection" value="class" />
</properties>
</persistence-unit>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
version="2.0">
<entity class="mypackage.Person">
<table name="Person" />
<named-query name="findLoginsByDate">
<query>select p from Person as p where p.loginDate >= :date </query>
</named-query>
<attributes>
<id name="id">
<column name="id" />
</id>
<basic name="fullName">
<column name="username" />
</basic>
<basic name="loginDate" >
<column name="loginDate" />
</basic>
</attributes>
</entity>
TypeDef和类型注释的xml配置是什么?
首先,我想知道使用usertype是处理我的问题的最佳解决方案吗?
在给定的情况下,当您将日期与时间一起存储,并且除了将其存储在日期内之外别无选择时,它可能是。(注意,像这样的一些参考资料说,使用时间戳应该是可以的,而且它甚至不会产生更大的索引。)
TypeDef和类型注释的xml配置是什么?
<typedef class="com.company.OracleDate" name="OracleDate" />
<property name="loginDate" type="OracleDate" />
深入的文章
前提条件:您必须迁移到Hibernate4.3或更高版本(请参见兼容性矩阵),并将JPA2.0配置文件迁移到2.1。
不需要实现Hibenate的usertype
,而是需要实现JPA的attributeConverter
接口。非常相似,这次只需要实现两个方法:DbType convertToDatabaseColumn(JavaType value)
和JavaType convertToEntityAttribute(DbType value)
。
<convert converter="com.company.OracleDateConverter" attribute-name="loginDate" />
问题内容: 我已经与Hibernate启动了一个新项目。Hibernate注释是更好的选择还是Hibernate XML映射更好? 我已经在XML配置中使用了Hibernate,但是我不了解注释。 进行基于注释的实施时有什么问题吗? 基于注释的应用程序维护更容易或更复杂吗? 哪一种更好(即注释或XML映射),哪一种被广泛使用?为什么? 如果我在不同的级别(即生产或集成或开发级别)使用另一个数据库,
我一直使用hibernate。cfg。配置Hibernate的xml。由于各种原因,我需要将所有配置转移到Java,并且我在映射实体方面存在问题。 以前在XML中,我的映射是这样的: 一切都是注释驱动的,所以我不需要指定其他任何东西。 现在,我使用Hibernate的配置来配置一切。类,如何添加映射?我尝试了配置。addClass(Test.class)但这会引发一个错误,即file 但是在第一次
问题内容: 在最近我从事的一些大型项目中,选择其中一种(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。 我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势? 问题答案: 注释有其用途,但它们不是杀死XML配置的灵丹妙药。我建议将两者混合! 例如,如果使用Spring,则将XML用于应用程序的依赖注入部分是完
我只想不使用xml,所以我需要非xml替代这些设置。这是我的POM。
问题内容: 我正在使用spring3.1.1和hibernate 4.1设置新项目。当我运行项目时,出现以下错误 我的applicationContext.xml MyDAOImpl 我添加了我的依赖罐,请建议我 请帮助我完成项目设置。请提出一些建议,在建立新项目结构时需要集中精力,在新项目结构中,为以后的升级而需要进行的更改较少。 抱歉,我是stackoverflow的新手,我不知道如何重播命令
我有一个Spring Boot Web应用程序,它尝试使用Hibernate访问我的数据库。我还有一个不同的、没有spring boot应用程序,它尝试访问相同的数据库。 我正在使用一个带注释的类配置无Spring Boot应用程序。 由于某些原因,Spring Boots自动配置的作用与注释类配置不同。 如果第一次连接到数据库并使用hibernate ddl创建模式,然后使用另一种配置方式重新连