Exception de mappage avec Hibernate 4.0, UserType 3.0.0.CR4 et Joda Time 2.1
Question
J'essaie actuellement de conserver Joda Time en veille prolongée en utilisant type d'utilisateur, mais je continue à recevoir l'erreur suivante dans Eclipse.
(failed.org.hibernate.MappingException :Impossible de déterminer le type pour :org.jadira.usertype.dateandtime.jsr310.PersistentLocalDateTime, dans la table :MODEL_OBJECT, pour les colonnes :[org.hibernate.mapping.Column(MODIFIED_DATE_TIME)])
mon fichier XML ressemble à ceci
<?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>`
et mon fichier java ressemble à ceci
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);
}
}
J'ai ajouté usertype.spi-3.0.0.jar et usertype.core.3.0.0.CR3.jar à mon chemin de classe.
Je n'ai aucune idée de ce qui se passe ici, donc votre aide serait grandement appréciée
La solution
Ajouter un fichier séparé avec les types personnalisés 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>
inclure ce fichier à votre mappage
<mapping resource="CustomTypes.hbm.xml" />
Autres conseils
Le problème est que vous utilisez les types JSR 310 (pour Thraetènes) plutôt que les types de temps Joda.
changer org.jadira.userType.dateandeTime.jsr310.persistTentLocaldateTime to org.jadira.userType.dateandeTime.joda.persistentLocaldateTeTime et votre problème doivent être résolus.
Cordialement Chris