【问题标题】:Unique constraint not created in JPAJPA 中未创建唯一约束
【发布时间】:2010-05-31 14:19:25
【问题描述】:

我创建了以下实体 bean,并将两列指定为唯一的。现在我的问题是该表是在没有唯一约束的情况下创建的,并且日志中没有错误。 有人有想法吗?

@Entity
@Table(name = "cm_blockList", uniqueConstraints = @UniqueConstraint(columnNames = {"terminal", "blockType"}))
public class BlockList {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="terminal")
    private Terminal terminal;
    @Enumerated(EnumType.STRING)
    private BlockType blockType;
    private String regEx;
}

【问题讨论】:

  • 我们的服务器是 JBoss,因此我相信 JPA 提供程序是休眠的。

标签: mysql jpa jboss unique-constraint


【解决方案1】:

嗯,我找到了另一种设计方法。更多是因为设计的演变而不是变通。
然而,我从一位遇到同样问题的同事那里听说,唯一约束仅由 hibernate(我们正在运行 JBoss 4.3)在创建整个数据库时创建。当您在现有数据库中创建新表时,它将不起作用。
所以在persistence.xml 中必须将hibernate.hbm2ddl.auto 设置为create-drop 才能使其工作。不过我无法确认。

【讨论】:

  • homaxto 你的观察是正确的。我遇到了同样的情况,并且在设置 create-drop 时约束有效。
  • 我也遇到了同样的问题,重新创建了整个数据库,成功了
  • 我通过使用所有 3 个选项重新创建整个数据库对其进行了测试:updatecreatecreate-drop,但这三个选项中的任何一个都不适用于我.从逻辑上讲,仅使用create-drop 而不是使用updatecreate 是没有意义的。在 Hibernate 中对我来说似乎是一个错误。但话又说回来,我想知道为什么到 2021 年这个 bug 还没有解决(10 岁的 bug??)。
【解决方案2】:

您不必删除所有内容,只需删除要为其创建唯一索引的特定表

【讨论】:

    【解决方案3】:

    比真正的答案更多的建议......

    • 您应该澄清您使用哪个 JPA 提供程序(和版本)来解决此类问题。

    • 我注意到您的一个专栏是 ManyToOne 关联的一部分,这可能是您的 JPA 提供商没有很好地处理的“特殊”情况。处理不好,我的意思是错误。我会检查问题跟踪器是否存在现有问题(可能会创建一个新问题,您的案例似乎符合 JPA)。

    【讨论】:

      【解决方案4】:

      如果你想要唯一的约束,你应该通过sql来做:

      ALTER TABLE cm_blockList ADD CONSTRAINT cm_blockList_unq UNIQUE (terminal);
      

      另请参阅:https://stackoverflow.com/a/3498242/1244488

      【讨论】:

        【解决方案5】:

        我也遇到了同样的问题,但是在映射文件中添加 unique-key="UK1_test" 效果很好。

        <property name="hibernate.hbm2ddl.auto">create</property> 在创建的映射文件中使用unique-key="UK1_test" unique="true" alter table employee add constraint UK1_test unique (addrId)

        【讨论】:

          【解决方案6】:

          这些天我在添加@Column(nullable = false, unique = true, length = 16) 时遇到了同样的问题,但没有得到唯一索引。

          经过几次尝试,我发现 spring data jpa update database table(ddl) 当字段更改但 @Column 更改时没有。所以创建表后赋值unique = true是没有用的。要得到一个唯一索引的表,你需要删除旧的。然后重新运行代码,让jpa重新创建表。

          我相信它,因为jpa在避免新的唯一索引时不知道它是否在旧表中包含相同的字段值。所以它接受一个全新的表。

          【讨论】:

            猜你喜欢
            • 2016-06-04
            • 1970-01-01
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-06
            • 1970-01-01
            相关资源
            最近更新 更多