jboss 未在JPA中创建唯一约束

a0zr77ik  于 2022-11-08  发布在  其他
关注(0)|答案(6)|浏览(160)

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

luaexgnf1#

嗯,我找到了另一种方法来做这个设计。更多的是因为这个设计是进化的,而不是一个变通的方法。
但是我从一个同事那里听说,他也有同样的问题,只有在创建整个数据库时,Hibernate(我们运行的是JBoss 4.3)才会创建唯一约束。当您在现有数据库中创建新表时,它将不起作用。
所以在persistence.xml中,有必要将hibernate.hbm2ddl.auto设置为create-drop以使其正常工作。

sg24os4d

sg24os4d2#

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

jc3wubiy

jc3wubiy3#

建议比真实的的答案还多...

  • 您应该澄清您使用的是哪个JPA提供程序(以及版本)来回答这些问题。
  • 我注意到你的一个列是ManyToOne关联的一部分,这可能是一个“特殊”的情况,你的JPA提供者没有很好地处理。没有很好地处理,我的意思是bug。我会检查一个现有的问题的问题跟踪器(也许会创建一个新的,你的情况似乎是JPA兼容的)。
r1wp621o

r1wp621o4#

如果您想要唯一的条件约束,您应该使用sql:

ALTER TABLE cm_blockList ADD CONSTRAINT cm_blockList_unq UNIQUE (terminal);

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

nwnhqdif

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)

ltskdhd1

ltskdhd16#

这些天我遇到了同样的问题,当我添加@Column(nullable = false, unique = true, length = 16)和没有得到一个唯一的索引.
经过几次尝试,我发现spring data jpa更新数据库表(ddl)时,字段的变化,但不与@列的变化。所以assign unique = true后,表创建是无用的。要得到一个表的唯一索引,你需要删除旧的。然后重新运行代码,让jpa再次创建表。
我相信这是因为jpa在避免新的唯一索引时不知道它是否包含旧表中的相同字段值,所以它接受一个全新的表。

相关问题