2014-05-16 34 views
0

我目前正試圖在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; 
    ... 
} 

我試過

  • 添加@IndexFolderItem.id - 這創造的FolderItem表正如人們所期望的指標,但並沒有影響到Folder
  • 副本protected int id;Folder並嘗試添加一個@index給它,這導致類似的異常「複製ID的」
  • 定義添加@Table(appliesTo = "Folder", indexes = { @Index(name = "fkId", columnNames = { "id" }) })Folder類,這實際上創建了指定索引的預期,但仍然創造了它自己的FK_9xcia6idnwqdi9xx8ytea40h3它等同於我的,除了名稱

回答

0

嘗試@PrimaryKeyJoinColumn(name = "foler_item_id")註釋文件夾類。