我有UserObject,其中包含SearchLog对象列表。此搜索日志列表大小定义为最大5 现在,每当我将搜索日志添加到SearchLog列表中的UserObject时,我希望将其添加到第一个位置。 SearchLog对象有一个我希望由hibernate自动生成的序列号。因此,如果searchLog列表在第一个位置添加第4个searchLog时包含3个元素,则先前持久对象的序列号应自动更改。
在尝试使用searchLog列表中的新SearchLog对象保存UserObject时,我得到了一个例外,即应该指定搜索日志的序列号(在DB中它不是空字段)。如果我明确设置序列号它工作正常,但我想要的是hibernate应该自动处理这个。可以这样做吗?或者只是手动设置序列号。
这是我一直在尝试的事情 -
public class UserObject {
private Integer id;
private String firstName;
private List<SearchLog> searchLogs = new ArrayList<SearchLog>();
}
public class SearchLog {
private Integer id;
private String searchQuery;
private Integer sequenceNumber;
private Integer userObjectId;
}
和相应的hbm文件 -
UserObject.hbm.xml
<hibernate-mapping package="com.xxx.admin.bo">
<class name="UserObject " table="USER" dynamic-update="true" dynamic-insert="true" discriminator-value="AT">
<id name="id" type="java.lang.Integer" column="ID" >
<generator class="identity"/>
</id>
<property name="firstName" type="java.lang.String" column="FIRST_NAME" length="30"/>
<list name="searchLogs" table="SEARCH_LOG" cascade="all-delete-orphan" lazy="true" inverse="true" >
<key column="USER_OBJECT_ID" />
<index column="SEQUENCE_NUMBER" />
<one-to-many class="SearchLog" />
</list>
</class>
</hibernate-mapping>
SearchLog.hbm.xml
<hibernate-mapping package="com.xxx.admin.bo">
<class name="SearchLog" table="SEARCH_LOG" dynamic-update="true" dynamic-insert="true" discriminator-value="AT">
<id name="id" type="java.lang.Integer" column="ID">
<generator class="identity"/>
</id>
<property name="searchQuery" type="java.lang.String" column="SEARCH_QUERY" length="250"/>
<property name="sequenceNumber" type="java.lang.Integer" column="SEQUENCE_NUMBER" not-null="true" />
<property name="userObjectId" type="java.lang.Integer" column="USER_OBJECT_ID"/>
</class>
</hibernate-mapping>
保存方法的代码块
userObject.getSearchLogs().add(0, searchLog);
getUserDao().save(userObject);
答案 0 :(得分:4)
在SearchLog.hbm.xml中使用此代替注意 insert =“false”update =“false”并删除非空属性
<property name="sequenceNumber" type="java.lang.Integer" column="SEQUENCE_NUMBER" insert="false" update="false"/>