2011-08-24 53 views
3

我有實體的 「用戶」 和 「客戶」:的Hibernate 3.6.7:問題@ANY和外鍵

@Entity 
@Table(name = "USR_USER") 
public class User extends PersistentObject { 

    [...] 

    @Any(metaColumn = @Column(name = "USR_OWNERTYPE")) 
    @AnyMetaDef(idType = "long", metaType = "string", metaValues = { 
     @MetaValue(targetEntity = Customer.class, value = "CST"), 
     @MetaValue(targetEntity = Client.class, value = "CLT") }) 
    @JoinColumn(name = "USR_OWNERID") 
    private PersistentObject owner; 
} 

@Entity 
@Table(name = "CST_CUSTOMER") 
public class Customer extends PersistentObject { 

    @Id 
    @GeneratedValue 
    @Column(name="CST_ID") 
    private long id; 

    [...] 

    // @OneToMany(mappedBy = "owner") 
    private transient Set<User> users; 
} 

運行這個(用spring),我得到了以下異常:

Caused by: org.hibernate.MappingException: Foreign key (FK35B91BB65D577CEF:USR_USER [USR_OWNERTYPE,USR_OWNERID])) must have same number of columns as the referenced primary key (CST_CUSTOMER [CST_ID]) 

我不明白這一點,因爲我將@AnyMetaDef(在「用戶」)中的類「Customer」映射爲常量「CST」。

我在做什麼錯?

預先感謝任何幫助 托馬斯

回答

1

「這是不可能的指定這種關聯關係的外鍵約束。」 - http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-types-anymapping

編輯:你想要的@Any的另一端是@OneToAny,並不存在。這可能是因爲你在不恰當的地方使用了@Any映射。 from the docs:「這不是映射多態關聯的常用方法,只能在特殊情況下使用它,例如,對於審計日誌,用戶會話數據等。」

仔細看看inheritance mapping,看看其中一種方法是不是一種更合適的映射關係的方法。

+0

啊好吧。謝謝。 – Thomas777

+0

這似乎是外鍵是由休眠自動創建的。 (我正在使用HSQL的休眠屬性「hibernate.hbm2ddl.auto」=>「創建」) 如何禁用爲該關係創建外鍵? – Thomas777

+0

錯誤是否發生在有或沒有上面註釋過的「@ OneToMany」?沒有'@ OneToMany',我認爲這應該是一個有效的'@ Any'映射。我期望FK錯誤來自'@ OneToMany'。 –