7

我创建了以下实体 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;
}
4

6 回答 6

7

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

于 2010-06-09T08:01:38.380 回答
2

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

于 2012-09-01T01:44:45.017 回答
0

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

  • 您应该澄清您为此类问题使用的 JPA 提供程序(和版本)。

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

于 2010-05-31T14:48:02.803 回答
0

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

ALTER TABLE cm_blockList ADD CONSTRAINT cm_blockList_unq UNIQUE (terminal);

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

于 2013-04-09T02:46:13.900 回答
0

我也遇到了同样的问题,但是添加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)

于 2014-04-03T09:52:20.020 回答
0

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

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

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

于 2021-09-06T09:32:15.107 回答