Hibernate - список генерации порядкового номера без пробелов и начиная с нуля - PullRequest
2 голосов
/ 12 августа 2010

У меня есть UserObject, который содержит список объектов SearchLog.Этот размер списка журнала поиска определен как максимум 5.
Теперь, когда я добавляю журнал поиска в объект UserObject в списке SearchLog, я хочу, чтобы он добавлялся в первую позицию.У объекта SearchLog есть порядковый номер, который я хочу, чтобы он был автоматически сгенерирован hibernate.Таким образом, если список searchLog содержит 3 элемента при добавлении 4-го searchLog в первую позицию, порядковый номер ранее сохраняемых объектов должен автоматически измениться.

При попытке сохранить UserObject с новым объектом SearchLog в списке searchLog, яполучите исключение, что должен быть указан порядковый номер журнала поиска (это не нулевое поле в БД).Если я устанавливаю порядковый номер явно, он работает нормально, но я хочу, чтобы 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);

1 Ответ

4 голосов
/ 12 августа 2010

В SearchLog.hbm.xml используйте это вместо. Обратите внимание insert = "false" update = "false" и удален ненулевой атрибут

<property name="sequenceNumber" type="java.lang.Integer" column="SEQUENCE_NUMBER" insert="false" update="false"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...