我目前正試圖在Hibernate中使用繼承,並遇到了InheritanceType.JOINED
。我喜歡將所有數據集中在一個表中並共享ID而不是在所有子類型表(@MappedSuperClass)中都有重複列的想法。但是Hibernate會自動在id
列的子類表上產生索引,如FK_idx3wiwdm8yp2qkkddi726n8o
,每次初始化我的Hibernate單例。我注意到,通過在MySQL表上創建64個鍵限制,因爲名稱在每次啓動時都以不同的方式生成。Hibernate Inheritance.JOINED生成FK名
處理這個問題的正確方法是什麼?這可以通過註釋解決嗎?我還能嘗試什麼?
我知道在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給它,這導致類似的異常「複製ID的」 - 定義添加
@Table(appliesTo = "Folder", indexes = { @Index(name = "fkId", columnNames = { "id" }) })
到Folder
類,這實際上創建了指定索引的預期,但仍然創造了它自己的FK_9xcia6idnwqdi9xx8ytea40h3它等同於我的,除了名稱