【问题标题】:JPA not recognizing existing constraints from DatabaseJPA 无法识别来自数据库的现有约束
【发布时间】:2017-07-17 05:43:15
【问题描述】:

在我的应用启动期间,休眠通过添加新的约束来改变我的表。这是完整了解我的问题的示例代码。

Postgresql 架构

create table public."A" {
    a_id serial primary key
}

create table public."B" {
    b_id serial primary key
}

create table public."C"(
    a_id integer not null references public."A" (a_id),
    b_id integer not null references public."B" (b_id),
)

数据库模型

class A{

    @Id
    @Column(name = "a_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    public Integer aId;

}


class B {

    @Id
    @Column(name = "b_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    public Integer bId;

}

class C {

    @ManyToOne
    @JoinColumn(name = "a_id")
    public A a;


    @ManyToOne
    @JoinColumn(name = "b_id")
    public B b;

}

在我的应用启动时,它再次创建了约束。

Hibernate: alter table public."C" add constraint FKk4caeiw8tynv7g0p13h5inaht foreign key (a_id) references public."A"
Hibernate: alter table public."C" add constraint FK4bsokehyo37wygp12onlu8fbl foreign key (b_id) references public."B"

在 DB 中,我看到约束已经可用

CONSTRAINT "C_a_id_fkey" FOREIGN KEY (a_id)
      REFERENCES public."A" (a_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "C_b_id_fkey" FOREIGN KEY (b_id)
      REFERENCES public."B" (b_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,

除了这些,我还看到了 2 个新的约束

CONSTRAINT FKk4caeiw8tynv7g0p13h5inaht foreign key (a_id) 
    REFERENCES public."A" (a_id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT FK4bsokehyo37wygp12onlu8fbl foreign key (b_id) 
    REFERENCES public."B" (b_id) MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION 

这里有什么问题?

【问题讨论】:

  • 你在persistence.xml中定义了哪个模式生成策略(hibernate.hbm2ddl.auto/avax.persistence.schema-generation.database.action)?

标签: hibernate jpa orm postgresql-9.1


【解决方案1】:

这是因为 Hibernate 正在比较约束名称并注意到指定名称不存在约束,因此它重新创建它认为它不存在。

一种解决方法是在注释中按名称手动指定约束:

@JoinColumn(name = "...", foreignKey = @ForeignKey(name = "..."))

注意:直到 5.2.7 的 Hibernate 版本存在一些问题,其中某些注释没有坚持正确地将外键注释值传递给数据库模式工具。我相信@JoinColumn 很好,但如果不是这样,使用 5.2.8 会包含我引入的所有修复程序以避免这些注释被忽略。

另一个解决方法显然是删除现有的约束,并简单地允许 Hibernate 使用自己的命名策略将它们添加回来。

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2018-10-14
    • 2016-02-09
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多