在Spring JPA中我有一个实体,我使用FlywayDb初始化模式。 我的实体是:
@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 :(得分:1)
现在更新您的问题之后,我可以猜测您的ITask insterface中的属性存在问题,请阅读that doc。在我看来,你必须覆盖embbedable实体属性来解决你的问题。