2014-05-04 17 views
2

我有兩個實體(稱爲EntityA和EntityB),其ID是一個隨機生成的UUID(因此該ID可以被認爲是全局唯一的)。 現在我想允許用戶爲A和B存儲額外的元數據(稱爲「標籤」),但在同一個表「TagValue」中。@OneToMany指向同一實體的不同類中

@Entity 
@Table 
public class EntityA { 
    @Id 
    private String uuid; 

    // Optional tags 
    @OneToMany 
    @JoinColumn(name="object_id", referencedColumnName="uuid") 
    private List<TagValue> tags = new LinkedList<TagValue>(); 

    // other fields 
} 

EntityB與uuid和tags部分類似。

現在TagValue:

@Entity 
@Table 
public class TagValue { 
    @Id 
    private String id; 

    // Referenced object UUID 
    @Column(name="object_id") 
    private String objectId; 

    // Tag type 
    @ManyToOne 
    @JoinColumn(nullable=false) 
    private TagType type; 

    // Value 
    @Column(nullable=false) 
    private String value; 
} 

如果我使用模式生成的Hibernate,我收到以下錯誤EntityB:

10:47:00,912 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 58) HHH000388: Unsuccessful: alter table TagValue add constraint FK_ijg5p0jl85r50shhygdudcxh4 foreign key (object_id) references EntityA. 

應該是這種映射方法通過JPA來支持?如果是這種情況,有沒有辦法避免TagValue/object_id上的約束生成?

在此先感謝!

+0

您是否嘗試刪除數據庫? Hibernate中的模式自動生成具有非常非常有限的功能,對於一個真正的系統,您總是**需要手工製作ddl腳本。 – Augusto

+0

刪除架構不起作用。但是,如果我在TagValue中具有通過objectId引用EntityA和EntityB的數據,則兩個表的約束創建將失敗。 – user1563703

回答

0

如果你想要一個單向關係,你不需要指定被引用的列名。這是試圖創建一個雙向關係,但因爲你的TagValue對象中沒有對象,所以Hibernate告訴你'我期待着一個EntityA對象附加這個ID,但它不在這裏'。

如果你讓我知道,如果你想你也可以使用一個JoinTable分離出的關係,我將修改我的答案

@Entity 
@Table 
public class EntityA { 
    @Id 
    private String uuid; 

    // Optional tags 
    @OneToMany 
    @JoinColumn(name="object_id") 
    private List<TagValue> tags = new LinkedList<TagValue>(); 
// other fields 
} 

這不起作用。

@Entity 
@Table 
public class EntityA { 
    @Id 
    private String uuid; 

    // Optional tags 
    @OneToMany 
    @Join(name="ENTITY_A_TAGS", 
     joinColumns = @JoinColumn(name="uuid"), 
     inverseJoinColumns = @JoinColumn(name="object_id")) 
    private List<TagValue> tags = new LinkedList<TagValue>(); 
// other fields 
} 

嘗試其中任何一種方法。他們也應該爲EntityB工作。如果你不能得到第一個工作,請嘗試使用連接表。

+0

感謝您的回答。我嘗試了第一種方法,Hibernate仍嘗試爲EntityA和EntityB創建外鍵約束。 關於第二種方法,我想避免每個有標籤的實體都有一個連接表。 – user1563703

+0

但是,你不想要外鍵?沒有兩個外鍵(一個用於EntityA,一個用於EntityB),則不能建立關係。 – JamesENL

+0

的確,我不希望TagValue表上的外鍵用於objectId字段。 Hibernate試圖做 如下: - 「fk_ijg5p0jl85r50shhygdudcxh4」 外鍵(OBJECT_ID)參考文獻EntityA(UUID) - 「fk_ijg5p0jl85r50shhygdudcxh4」 外鍵(OBJECT_ID)參考文獻EntityB(UUID) – user1563703

相關問題