我有以下父对象,它映射到我的数据库中的表:
public Parent {
private Long id;
private String mid;
private Integer days;
private BigDecimal fee;
private DateTime createdDate = new DateTime();
private DateTime lastModifiedDate;
private Map<String, Child> children;
}
使用以下.hbm.xml:
<hibernate-mapping default-access="field">
<class name="Parent" table="parent_table">
<id column="id" length="50" name="id" unsaved-value="null">
<generator class="increment"/>
</id>
<property length="50" name="mid"/>
<property name="days"/>
<property name="fee"/>
<property name="createdDate" type="(...)PersistentDateTime"/>
<property name="lastModifiedDate" type="(...)PersistentDateTime"/>
<map cascade="all-delete-orphan" inverse="true" name="children" >
<key column="parentId" />
<map-key column="country" type="string" />
<one-to-many class="Child" />
</map>
</class>
</hibernate-mapping>
子对象如下:
public class Child implements Serializable {
private Long parentId;
private String country;
private String cu;
}
使用以下.hbm.xml:
<hibernate-mapping default-access="field">
<class name="Child" table="child_table">
<composite-id>
<key-property name="parentId"/>
<key-property name="country"/>
<key-property name="cu"/>
</composite-id>
</class>
</hibernate-mapping>
通过以下方式从我的数据库中获取父对象:
getSession().createCriteria(Parent.class)
.add(Restrictions.eq("mid", mid))
.uniqueResult();
在子映射中对Child.cu进行一些更改后,我在Parent对象上调用了saveOrUpdate。执行此操作后,所有似乎都保存/更新正常但在检查数据库中的child_table后,这些更改尚未保存/更新。
我认为这与Parent类中地图的映射有关,但似乎无法弄明白。任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:1)
如果我理解正确,您正在修改一个字段,该字段是您实体的主键的一部分。这是非法的:ID应该是不可变的。
我的建议是遵循良好做法:使用非复合,纯技术,自动生成的主键。一切都会变得更简单(也更快)。