2015-11-01 104 views
0

在Spring JPA中,我有一個實體,並使用FlywayDb初始化模式。 我的實體是:JPA @UniqueConstraint沒有看到列

@Entity 
@Table(schema = "scheduler", 
     uniqueConstraints={@UniqueConstraint(name = "uq_task", columnNames = {"task", "date_at"})} 
) 
public class Task { 
    @Id 
    private Long id; 

    @Embedded 
    @Column(nullable = false) 
    private ITask task; 

    @Column(nullable = false) 
    private Date dateAt; 

} 

架構如下初始化:

CREATE SCHEMA scheduler; 

CREATE TABLE scheduler.task (
    id bigserial primary key, 
    task bytea NOT NULL, 
    date_at timestamp NOT NULL 
); 

CREATE UNIQUE INDEX uq_task 
    ON scheduler.task(task, date_at); 

沒有實體上的限制,它的工作原理,它沒有。特別是我有個例外:

Caused by: org.hibernate.AnnotationException: Unable to create unique key constraint (task, date_at) on table task: database column 'task' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types) 
    at org.hibernate.cfg.Configuration.buildUniqueKeyFromColumnNames(Configuration.java:1684) 
    at org.hibernate.cfg.Configuration.buildUniqueKeyFromColumnNames(Configuration.java:1616) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1452) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) 

我使用H2數據庫。

ITask是一個接口與幾個POJO實現。 ITask接口註釋爲@Embeddable

我的猜測是,JPA嘗試對尚未由FlywayDb庫創建的列應用唯一約束。但這對我來說毫無意義。

有什麼想法?

+0

一個問題,當你刪除jpa唯一約束劑量它的工作註釋?! – shareef

+0

是的,正如我所說的,在實體類中沒有註釋但是在flyway的sql文件中定義了約束,一切都OK! –

+0

flyway中的任務是'byte'類型,但是在jpa中它的Object'Task'就是這樣!你可能需要製作'@Column(name =「task」)'和'@Column(name =「date_at」)'這可能會修復,我認爲你需要添加自加入連接...閱讀http: //stackoverflow.com/questions/15216321/jpa-self-join-using-jointable – shareef

回答

1

更新了您的問題後,我現在可以猜測ITask內部存在屬性問題,請參閱that doc。在我看來,你必須覆蓋可嵌入的實體屬性來解決你的問題。

+0

我更新了問題。 ITask是用@Embeddable註解的接口 –

+0

我修改了我的答案 – burovmarley

+0

我刪除了@ Embeddable,現在它抱怨缺少的'date_at'列 –