Hibernate Inheritance.JOINED生成了FK名称

时间:2014-05-16 16:10:06

标签: java mysql hibernate myisam

我目前正在尝试在Hibernate中使用继承并遇到InheritanceType.JOINED。我喜欢将所有数据集中在一个表中并共享ID而不是在所有子类型表(@MappedSuperClass)中都有重复列的想法。但每当我初始化我的Hibernate单例时,Hibernate会自动在id列上的子类表上生成索引,如FK_idx3wiwdm8yp2qkkddi726n8o。我注意到,通过在MySQL表上达到64键限制,因为每次启动时名称的生成都不同。

处理此问题的正确方法是什么?这可以通过注释来解决吗?我还能尝试什么?

我知道在SO上有无数类似的问题,但是我们无法找到解决我特定问题的问题。

我不打算在开发模式下禁用hbm2ddl.auto。

我正在使用MyISAM。没有实际的外键。这就是Hibernate生成默认索引的原因。无论如何,问题与InnoDB和真正的外键相同,因为名称仍然是随机的。或者也许Hibernate会在这种情况下检查是否存在。我真的没有看到,为什么它在MyISAM表上没有这样做。

当我遇到类似问题时,解决方案也可以是为该单列索引指定名称。但是如何?

超级类:FolderItem

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class FolderItem implements Comparable<FolderItem>
{
    @Id
    @GeneratedValue
    protected int       id;
    protected String    name;
    @OneToOne
    @ForeignKey(name = "fkParent")
    protected Folder    parent;
    ...
}

子类:文件夹

@Entity
public class Folder extends FolderItem
{
    @OneToMany(mappedBy = "parent")
    @OrderBy(value = "sortOrder")
    private List<FolderItem>    children;
    ...
}

我尝试了什么

  • @Index添加到FolderItem.id - 这会在FolderItem表上创建一个索引,但不会影响Folder
  • protected int id;复制到Folder并尝试向其添加@Index,这导致类似于&#34的异常;重复定义ID&#34;
  • @Table(appliesTo = "Folder", indexes = { @Index(name = "fkId", columnNames = { "id" }) })添加到Folder类,它实际上按预期创建了我指定的索引,但仍然创建了它自己的FK_9xcia6idnwqdi9xx8ytea40h3,除了名称
  • 之外与我的相同

1 个答案:

答案 0 :(得分:0)

为Folder类尝试@PrimaryKeyJoinColumn(name = "foler_item_id")注释。