有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Hibernate 4.0、UserType 3.0.0的java映射异常。CR4和Joda时间2.1

我目前正试图使用usertype在Hibernate中持久化Joda时间,但在eclipse中不断出现以下错误

Error Message

(failed.org.hibernate.MappingException:无法确定以下列的类型:[org.hibernate.mapping.Column(MODIFIED_DATE_TIME)]:org.jadira.usertype.dateandtime.jsr310.PersistentLocalDateTime,位于表:MODEL_OBJECT)

我的xml文件如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="model" >
    <class name="ModelObject" table="MODEL_OBJECT">
        <id name="id" column="MODEL_ID" >
            <generator class="native"></generator>
    </id>
    <property name="modifiedDateTime"             
            type="org.jadira.usertype.dateandtime.jsr310.PersistentLocalDateTime"
            column="MODIFIED_DATE_TIME"/>
        <property name="creationDateTime"
            type="org.jadira.usertype.dateandtime.jsr310.PersistentLocalDateTime"
            column="CREATION_DATE_TIME"/>
    </class>
</hibernate-mapping>`

我的java文件如下所示

package model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.joda.time.LocalDateTime;

public abstract class ModelObject  {

private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

private long id;
private LocalDateTime  modifiedDateTime = new LocalDateTime ();
private LocalDateTime  creationDateTime = new LocalDateTime ();

public Long getId(){
    return id;
}

public void setId(Long id){
    firePropertyChange("id", this.id, this.id = id);
}

public LocalDateTime  getModifiedDateTime(){
    return modifiedDateTime;
}

public void setModifiedDateTime(LocalDateTime  modifiedDateTime) {
    firePropertyChange("modifiedDateTime", 
                this.modifiedDateTime, 
                this.modifiedDateTime = modifiedDateTime);
}

public LocalDateTime  getCreationDateTime(){
    return creationDateTime;
}

public void setCreationDateTime(LocalDateTime  creationDateTime){
    firePropertyChange("creationDateTime", 
                this.creationDateTime, 
                this.creationDateTime = creationDateTime);
}

public void addPropertyChangeSupportListener(PropertyChangeListener listener){
    changeSupport.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener){
    changeSupport.removePropertyChangeListener(listener);
}

public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener){
    changeSupport.addPropertyChangeListener(propertyName, listener);
}

public void removePropertyChangeListener(String propertyName, 
                                             PropertyChangeListener listener){
    changeSupport.addPropertyChangeListener(propertyName, listener);
}

protected void firePropertyChange(String propertyName, Object oldValue, Object newValue){
    changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}

}

我添加了usertype。spi-3.0.0。jar和用户类型。果心3.0.0.CR3。jar到我的类路径

我不知道这里发生了什么,所以非常感谢您的帮助


共 (2) 个答案

  1. # 1 楼答案

    问题是您使用的是JSR310类型(适用于threeten),而不是Joda时间类型

    改变组织。贾迪拉。用户类型。日期和时间。jsr310。组织的PersistentLocalDateTime。贾迪拉。用户类型。日期和时间。乔达。PersistentLocalDateTime和您的问题应该得到解决

    问候克里斯

  2. # 2 楼答案

    使用HBM自定义类型添加单独的文件
    CustomTypes.hbm.xml

    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.softcomputer.softlab.business.core">
       <typedef name="localJodaDate"
          class="org.jadira.usertype.dateandtime.jsr310.PersistentLocalDateTime" />
    </hibernate-mapping>  
    

    将此文件包括到映射中

      <mapping resource="CustomTypes.hbm.xml" />