我目前正在尝试在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,除了名称答案 0 :(得分:0)
为Folder类尝试@PrimaryKeyJoinColumn(name = "foler_item_id")
注释。