Hibernate Mapping可选值

时间:2011-05-18 20:06:34

标签: java hibernate hibernate-mapping

我有两个需要进行XML映射的类(最终它们都将被修改为Annotations,但目前我们需要支持XML映射)。

我有一个User对象,目前看起来像这样:

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 - 无济于事。

3 个答案:

答案 0 :(得分: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", joinColumns=@JoinColumn(name="PREFERENCES_ID", unique=true), inverseJoinColumns=@JoinColumn(name="PERSON_ID", unique=true))
    public Person getPerson() {
        return person;
    }
}

答案 1 :(得分:0)

查看Hibernate参考文档的Association Mappings chapter,因为它解释了映射各种关联的几种不同方法,具体取决于关系是单向还是双向,一对一,一 - to-many,或many-to-many,以及表之间的关联是直接的还是通过连接表完成的。

答案 2 :(得分:0)

尝试将其映射为仅包含一个组件的复合ID。

类似的东西:

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

否则,您可以将其值设置为唯一,并使用hibernate内置生成的键,同时仍然可以基于Person查找单行。