我有两个需要进行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 - 无济于事。
答案 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查找单行。