我已经创建了以下实体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;
}
6条答案
按热度按时间luaexgnf1#
嗯,我找到了另一种方法来做这个设计。更多的是因为这个设计是进化的,而不是一个变通的方法。
但是我从一个同事那里听说,他也有同样的问题,只有在创建整个数据库时,Hibernate(我们运行的是JBoss 4.3)才会创建唯一约束。当您在现有数据库中创建新表时,它将不起作用。
所以在persistence.xml中,有必要将
hibernate.hbm2ddl.auto
设置为create-drop
以使其正常工作。sg24os4d2#
您不必删除所有内容,只需删除要为其创建唯一索引的特定表即可
jc3wubiy3#
建议比真实的的答案还多...
ManyToOne
关联的一部分,这可能是一个“特殊”的情况,你的JPA提供者没有很好地处理。没有很好地处理,我的意思是bug。我会检查一个现有的问题的问题跟踪器(也许会创建一个新的,你的情况似乎是JPA兼容的)。r1wp621o4#
如果您想要唯一的条件约束,您应该使用sql:
另请参阅:https://stackoverflow.com/a/3498242/1244488
nwnhqdif5#
我也遇到了同样的问题,但是在Map文件中添加
unique-key="UK1_test"
工作得很好。<property name="hibernate.hbm2ddl.auto">create</property>
与Map文件中的unique-key="UK1_test" unique="true"
创建alter table employee add constraint UK1_test unique (addrId)
ltskdhd16#
这些天我遇到了同样的问题,当我添加
@Column(nullable = false, unique = true, length = 16)
和没有得到一个唯一的索引.经过几次尝试,我发现spring data jpa更新数据库表(ddl)时,字段的变化,但不与@列的变化。所以assign unique = true后,表创建是无用的。要得到一个表的唯一索引,你需要删除旧的。然后重新运行代码,让jpa再次创建表。
我相信这是因为jpa在避免新的唯一索引时不知道它是否包含旧表中的相同字段值,所以它接受一个全新的表。