我存储JodaTime DateTime
字段timestamptz
通过使用列org.jadira.usertype:usertype.jodatime:1.9
。 应用服务器有+4时区。 DB服务器+9时区。 new DateTime()
的结果${currentTime+1hour}+9
其中+9是时区(正确的值是${currentTime+5hours)+9
)。
我还没有发现任何相关的话题。 java.util.Date
商店正确。
域对象有以下映射属性:
static mapping = {
dateCreated sqlType:'timestamptz'
}
我怎么可以存储日期时间是否正确?
只需设置JPA属性:
<property name="jadira.usertype.autoRegisterUserTypes"
value="true"/>
<property name="jadira.usertype.databaseZone"
value="jvm"/>
<property name="jadira.usertype.javaZone"
value="jvm"/>
我遇到过同样的问题。 在配置指定的应用程序和数据库解决区域问题。
<prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
<prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop>
<prop key="jadira.usertype.javaZone">America/Los_Angeles</prop>
好。 我花8小时解决问题。 如果您正在使用的用户类型项目坚持JodaTime,你必须设置databaseZone
财产PersistentDateTime
级等于当前的应用服务器时区(不是数据库!)。
但最好使用官方休眠支持 。 它解决了这个问题,因为它使用的盒子java.utl.Date
坚持DateTime
和java.util.Date
默认情况下坚持正确
开始尝试与JVM = -Duser.timezone UTC到JAVA_OPTS这样的时间是在一个区域,然后你可以做你的操作将其转换为任何你的。
费多尔,
我说得对假设你使用的是Oracle TIMESTAMP WITH TIME ZONE列? 用户类型不支持这种类型的,但(即带有时区)由于与JDBC数据库之间不同的处理,虽然该项目将很乐意接受的补丁。
这里也有一些很好的讨论WRT甲骨文在这里: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/
我已经通过创建其他PersistentDateTime解决了这个问题延伸AbstractVersionableUserType。
import java.sql.Timestamp;
import org.hibernate.SessionFactory;
import org.hibernate.usertype.ParameterizedType;
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper;
import org.jadira.usertype.spi.shared.AbstractVersionableUserType;
import org.jadira.usertype.spi.shared.IntegratorConfiguredType;
import org.joda.time.DateTime;
public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType {
@Override
public int compare(Object o1, Object o2) {
return ((DateTime) o1).compareTo((DateTime) o2);
}
@Override
public void applyConfiguration(SessionFactory sessionFactory) {
super.applyConfiguration(sessionFactory);
TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper();
columnMapper.setDatabaseZone(null);
columnMapper.setJavaZone(null);
}
}