我在SO上阅读了一些类似的问题,但我的问题是"稍有不同"。
我是
之类的实体@Entity
@Table(name = "commission_template")
public class CommmissionTemplate {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private Double min;
private Double max;
private Double value;
private boolean active;
@Convert(converter = LocalDateToSqlConverter.class)
private LocalDate start;
@Convert(converter = LocalDateToSqlConverter.class)
private LocalDate end;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "commission_template_commission_type",
joinColumns = {@JoinColumn(name = "commission_template_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "type_id", referencedColumnName = "name")}
)
private CommissionType type;
// getters/setters etc.
}
和persistence.xml
中的配置一样
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="${db.dialect}"/>
然后当我在日志中开始申请时我已经
Hibernate: create table commission_template (id int8 not null, active boolean not null, end timestamp, max float8, min float8, start timestamp, value float8, primary key (id))
Hibernate: create table commission_template_commission_type (type_id varchar(255), commission_template_id int8 not null, primary key (commission_template_id))
这里我们有魔力,因为Hibernate不会创建表commission_template
。 pgAdmin告诉我&#34;没有这样的表&#34;。最好的事情是,当我关闭应用程序和Hibernate调用drop时,他们会记录他们丢弃commission_template
表。
我尝试更改表名,然后将其设置为prowizje_szablony
...
Caused by: org.postgresql.util.PSQLException: ERROR: relation "prowizje_szablony" does not exist
Pozycja: 273
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2077)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1810)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:498)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:116)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
... 77 more
任何想法,建议或提示?
//编辑:IMO,问题出现在转换器中,而Hibernate无法处理它们。
//解决方法:通过以下方式手动创建该表:
CREATE TABLE commissiontemplate
(
id bigint NOT NULL,
active boolean,
start timestamp without time zone,
"end" timestamp without time zone,
min double precision,
max double precision,
value double precision,
CONSTRAINT id PRIMARY KEY (id )
)
WITH (
OIDS=FALSE
);
ALTER TABLE commissiontemplate
OWNER TO koziolek;
使用默认名称(我知道波兰语是一种非常好的语言,您可以在其中调用表chrząszcz
,但请...而不是在IT中)并将DDL更改为validate
并不好,因为我们需要其他工具覆盖架构更新,但有效...
答案 0 :(得分:0)
根据日志,Hibernate实际上正在为您创建这些表。确保您连接到同一个数据库实例,并使用与Hibernate使用的模式相同的模式。
您也可以尝试切换到:
<property name="hibernate.hbm2ddl.auto" value="update"/>
因为一旦SessionFactory关闭,create-drop就会删除模式。
答案 1 :(得分:0)
答案是:
Hibernate无法使用名为 end
的列创建表格,因为它是关键词,但永远不会告诉您。只需记录事件&#34;创建表&#34;。
当我手动创建表格时,pgAdmin将"
添加到DDL,它运行正常。因为我有一些习惯,并且总是在查询中使用"
所以手动检查查询工作正常。
当hibernate对此表执行sql查询时,我得到SQLGrammarException
...这是一个提示错误的提示。我更改列名称,现在可以正常工作。