我的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中运行应用程序......
有人有想法吗?
答案 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