Hibernate LocalDateTime:Postgresql模式生成创建类型为" bytea"的列。在外部Tomcat中

时间:2017-08-22 08:57:48

标签: postgresql hibernate tomcat jpa spring-boot

我的postgresql数据库的hibernate架构生成有问题,我的webapp托管在外部tomcat(8.5.20)中。 为此,我在我的春季启动应用中将spring.jpa.hibernate.ddl-auto设置为create-drop。 当我使用嵌入式tomcat在我的eclipse中运行应用程序时,所有 LocalDateTime 列都会生成为 timestamp without time zone这很好。 但是当生成war文件并使用激活的模式生成部署到外部tomcat时,所有这些列都将生成为类型 bytea

我试图定义在context.xml中链接的全局jndi资源(server.xml),只有基于context.xml的jndi reosurces,以及spring.data和spring.jpa配置im在我的应用程序中运行eclipse时。属性。但是一旦我将生成的war部署到我的外部tomcat,这些列就会生成为bytea。

我还将postgresql-42.1.1.jar放到tomcat lib文件夹中,但也没有任何成功。

这些是我对本地environemt的设置,可以正常使用:

spring.datasource.url= jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.hibernate.use-new-id-generator-mappings=true
spring.jpa.hibernate.ddl-auto=create-drop

这是在context.xml中定义tomcat jndi数据源的示例,它生成bytea列:

<Resource name="jdbc/test" auth="Container"
    type="javax.sql.DataSource" maxActive="20" maxIdle="5" maxWait="10000"
    username="postgres" password="postgres" driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://localhost:5432/test">
</Resource>

在这种情况下,我的应用程序属性如下所示:

spring.datasource.jndi-name=java:comp/env/jdbc/test
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.hibernate.use-new-id-generator-mappings=true
spring.jpa.hibernate.ddl-auto=create-drop

最后我尝试过构建并运行生成的jar。列再次生成类型&#39; bytea&#39;。因此,作为时区生成列的唯一变体是在eclipse中运行应用程序......

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

一般不应该工作。是的,使用BLOB约定。 Java8 LocalDateTime并不是JPA 2.1的正式部分

问题是为什么一个配置正面工作?我几乎可以肯定,PostgreSQL没有任何问题。

也许你有更新/更老的hibernate版本?较新的Hibernate版本可能会提前发布&#39; ?纯粹的推测,我在最近几年Eclipselink用户和Eclipselink都没有实现。

一般建议和良好的证明方式是JPA型转换器

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate locDate) {
        return (locDate == null ? null : Date.valueOf(locDate));
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
        return (sqlDate == null ? null : sqlDate.toLocalDate());
    }
}
编辑:也许你在某个JAR中有这样的转换器,所以自动被迫???

EDIT2:Adam Bien的代码和理论可能更好吗?

http://www.adam-bien.com/roller/abien/entry/new_java_8_date_and