Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate和Spring数据JPA中使用xml配置代替@Type注释_Java_Oracle_Hibernate_Spring Data Jpa - Fatal编程技术网

Java 在hibernate和Spring数据JPA中使用xml配置代替@Type注释

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

我的公司在一个遗留项目中使用了Java7Hibernate3以及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类代码:

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" />