2011-05-18 125 views
3

我有兩個需要進行XML映射的類(最終它們都將被修改爲Annotations,但目前我們需要支持XML映射)。休眠映射可選值

我有一個用戶對象,目前看起來是這樣的:

public class User { 
    private Key key; 
    private Name name; 
} 

我需要在選項添加對這些用戶的一些(我們有兩種不同類型的用戶共享同一個對象)。

public class Preferences { 
    private Person person; //The person key acts as our foreign and primary key 
    private Integer numToShow; 
    private String defaultScreenToShow; 
} 

我的人XML是這樣的:

<hibernate-mapping package="com.example.entities"> 
    <id key column="PERSON_ID" /> <!-- Leaving out custom generator --> 

    <!-- 
     Not sure what the column needs to be here, as 
     preferences are in own table. Also read it has to 
     be a faked out many-to-one here as not all users will 
     have preferences. 
    --> 
    <many-to-one name="preferences" not-null="false" /> 
    <component class="com.example.entities.Name"> 
     <property column="first_name" name="first" /> 
     <property column="last_name" name="last" /> 
    </component> 

</hibernate-mapping> 

我的喜好XML文件是這樣:

<hibernate-mapping package="com.example.entities"> 
    <property column="default_screen" name="defaultScreenToShow" /> 
    <property column="number_search_results" name="numToShow" /> 
    <!-- Not sure what the ID needs to be here --> 
</hibernate-mapping> 

我在所有誠實漂亮的綠色與Hibernate,但這似乎就像一些應該很容易映射的東西。我認爲我有正確的映射,但是在嘗試加載一個人時(我將這些類標記爲Serializable - 無濟於事),我得到了反序列化異常。

回答

1

我能夠以我想要的方式解決這個問題(註釋新類,並添加到舊類的XML - 當我在每種情況下使用XML時,我只能存儲這個Ordinal值枚舉,這是不期望的)。

Person.hbm.xml 
<join table="PREFS_JOIN_TABLE" optional="true"> 
    <key column="PERSON_ID" /> 
    <many-to-one name="preferences" column="PREFERENCES_ID" not-null="true" unique="true" cascade="all"/> 
</join> 

我的新類,這點我是可以註解,現在看起來像:

@Entity 
@Table(name = "PREFERENCES") 
public class UserPreferences implements Preferences { 
    private Long id; 
    private Panel defaultPanelToShow; 
    private Person person; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="prefSeq") 
    @SequenceGenerator(name="prefSeq", sequenceName = "SQ_PREFERENCES_ID", allocationSize = 10, initialValue = 1) 
    @Column(name="PREFERENCES_ID") 
    public Long getId() { 
     return id; 
    } 

    @Column(name="DEFAULT_USER_PANEL") 
    @Enumerated(EnumType.STRING) 
    public Panel getDefaultRequestPanel() { 
     return defaultPanelToShow; 
    } 

    @OneToOne 
    @JoinTable(name="PREFS_JOIN_TABLE", [email protected](name="PREFERENCES_ID", unique=true), [email protected](name="PERSON_ID", unique=true)) 
    public Person getPerson() { 
     return person; 
    } 
} 
0

查看Hibernate參考文檔的Association Mappings chapter,因爲它解釋了映射各種關聯的幾種不同方法,具體取決於關係是單向還是雙向,一對一,一對多,或者多對多,以及表之間的關聯是直接的還是通過連接表完成的。

0

嘗試將它映射爲僅有一個組件的複合ID。

喜歡的東西:

<composite-id name="col_name"> 
    <key-many-to-one name="person" class="Person" column="person_col"/> 
</composite-id> 

否則,你可以只設置它的值是唯一的,使用內置在生成的密鑰,同時仍然能夠查找基於人單排休眠的。