Java Hibernate-忽略唯一列约束
我有一个MySQL表来保存标记(例如,与这里在堆栈溢出上使用的标记类似)。它只是有一个id(pk)和一个标记列来保存标记本身 我的标记实体的带注释的get方法如下所示Java Hibernate-忽略唯一列约束,java,mysql,hibernate,Java,Mysql,Hibernate,我有一个MySQL表来保存标记(例如,与这里在堆栈溢出上使用的标记类似)。它只是有一个id(pk)和一个标记列来保存标记本身 我的标记实体的带注释的get方法如下所示 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false) public int getId() { return this.id; } @Column(name
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return this.id;
}
@Column(name = "tag", unique = true, nullable = false)
public String getTag() {
return this.tag;
}
我在标记上使用了一个唯一的列约束,因为给定的标记不应该有多行。但是,Hibernate似乎忽略了这一点,也就是说,我可以多次保存完全相同的标记,它只是创建一个新行,而不是抛出异常
我是否遗漏了什么,或者这是否有效?来自JavaDoc of(unique=true
on@Colunm
只是一个快捷方式):
此注释用于指定在为主表或辅助表生成的DDL中包含唯一约束
因此,它似乎没有在插入时强制唯一性。在任何情况下,您都应该在数据库中创建一个唯一的约束。您忽略了这只是一个信息
您还应该在数据库中的列上添加约束 谢谢你的回答。顺便问一下,这不是很荒谬吗?!不,不是。数据库可以快速验证实体是否唯一。ORM不可能这么快。这就是为什么这是有意义的。我的意思是,我使用这个注释并且它没有在数据库中创建相应的唯一约束,这不是很荒谬吗?这就是我最初理解它的行为方式,尽管我做了两个实验,似乎只有在我使用某些数据库(如HSQL)时,它才对模式反映“unique=true”。当我切换DB配置时,相同的代码生成了MySQL约束。否。该工具可以生成一个脚本来创建数据库。然后将添加约束。但是,当您创建映射时,由您来将DB结构反映到您的应用程序对象中。它似乎在某些数据库上创建了限制,而在其他数据库上没有。注释反映在相应SQL约束的生成中是有意义的。在创建DB的脚本中可以这样做。我通常根本看不到后者,因为我通过Maven使用JPA/Hibernate。