当前位置: 首页 > 知识库问答 >
问题:

在hibernate与Spring Data JPA中使用xml配置代替@type注释

白博易
2023-03-14

我的公司在一个遗留项目中使用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配置是什么?

共有1个答案

伊羽
2023-03-14

首先,我想知道使用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创建模式,然后使用另一种配置方式重新连