我该如何要求Hibernate在外键(JoinColumn)上创建索引?

8 浏览
0 Comments

我该如何要求Hibernate在外键(JoinColumn)上创建索引?

这是我的模型:

class User {
    @CollectionOfElements 
    @JoinTable(name = "user_type", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "type", nullable = false)
    private List types = new ArrayList();
}

可以想象到会有一个名为"user_type"的表,它有两列,一列是"user_id",另一列是"type"。

当我使用hbm2ddl生成ddls时,我希望有这个表,并且有关于"user_id"的外键约束。

然而,这列没有索引。我该如何让Hibernate为我生成索引?

0
0 Comments

Hibernate无法自动在外键(JoinColumn)上创建索引的原因是因为某些方言会自动为外键创建索引,而其他方言则不会。Hibernate的Dialect类以及没有覆盖getAddForeignKeyConstraintString方法的所有子类(如Oracle、SQL Server等)都不会在外键上创建索引。然而,MySQLDialect覆盖了该方法,并为每个外键添加了索引。

然而,最新的源代码显示MySQLDialect并没有添加索引的代码。相反,根据这篇帖子的说法,如果使用InnoDB方言,MySQL会自动添加索引。

在MySQL中,如果既没有定义CONSTRAINT符号,也没有定义FOREIGN KEY index_name,那么外键索引名称将使用引用外键列的名称生成。

因此,要求Hibernate在外键上创建索引的解决方法是使用MySQL的InnoDB方言。

0
0 Comments

问题的原因是在使用Hibernate时,想要在外键(JoinColumn)上创建一个索引,但没有找到直接的方法来实现这一点。虽然有一些注解可以用来控制列表语义中的排序,但并没有直接创建索引的功能。

解决方法是尝试使用一个注解来创建索引,例如使用注解(name="user_type_index")。这个注解可以在外键上创建一个索引,但可能会受到数据库的限制。

相关的问题中,提到了与有关的问题,并且在Hibernate 4.3+中提供了一个解决方法。具体的解决方法可以在hibernate.atlassian.net/browse/HHH-4263上找到。

0