Hibernate Session.save проблема - PullRequest
       1

Hibernate Session.save проблема

1 голос
/ 03 октября 2011

Привет, у меня есть доменный объект, скажем, Student и его Roll no в качестве первичного ключа.

вот примерное сопоставление для него.

    @Id
@Column(name = "Roll_NO", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Roll_NO_SEQ")
@SequenceGenerator(name = "Roll_NO_SEQ", sequenceName = "Roll_NO_SEQ", allocationSize = 1)
public Long getRollNo() {
    return this.rollNo;
}

проблема: скажем, если конкретный студент был удален из базы данных, а затем повторно принят во время повторного зачисления, я хочу сохранить старый номер нет. поэтому, когда я вызываю session.save, Hibernate назначает новый номер Нет на основе указанной последовательности, а не то, что я устанавливаю с помощью метода setRollNo (). Есть ли способ достичь этого в спящем режиме?

Ответы [ 3 ]

3 голосов
/ 03 октября 2011

не удаляйте запись, добавьте новое логическое поле с именем soemthign, например active или valid , и вместо удаления просто установите active = false .

Или

Вы можете вставить запись, подлежащую удалению, в архивную таблицу, а затем удалить, а затем оттуда посмотреть.

1 голос
/ 04 октября 2011

Учитывая, что вы не можете изменить устаревший код, Райан имеет правильную идею .Некоторое время назад мне приходилось делать то же самое в личном проекте.Он состоял из двух частей: простая часть состоит в том, чтобы разрешить эффективную настройку идентификатора столбца с другим идентификатором-автонумерацией ... а другая - заставить генератор идентификаторов прекратить перезаписывать это значение при переходе к Save ().

Вот код для FlexibleIDGenerator, который я использовал:

public class FlexibleIDGenerator extends IdentityGenerator implements Configurable {
   public static final String DEFAULT = "default";

   private IdentifierGenerator assignedGenerator;
   private IdentifierGenerator defaultGenerator;

@SuppressWarnings("unchecked")
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
      //boolean useDefault = false;

      if (object instanceof OverridableIdentity) {
          if (((OverridableIdentity) object).isIDOverridden()) {
              try {
                  Class cl = object.getClass().getSuperclass();
                  Method[] methods = cl.getDeclaredMethods();

                  for (int i = 0; i < methods.length; i++) {
                      if (methods[i].getName().equalsIgnoreCase("setId")) {
                          methods[i].invoke(object, Integer.valueOf((((OverridableIdentity) object).getOverriddenID())));
                      }
                  }
              } catch (Exception ex) {
                  ex.printStackTrace();
              }
              return assignedGenerator.generate(session, object);
          } else {
              return defaultGenerator.generate(session, object);
          }
      } else {
          return defaultGenerator.generate(session, object);
      }
   }

   public void configure(Type type, Properties params, Dialect d) throws MappingException {
      assignedGenerator = IdentifierGeneratorFactory.create("assigned", type, params, d);
      defaultGenerator = IdentifierGeneratorFactory.create("increment", type, params, d);          
   }
}

Чтобы использовать его для класса, вы обновляете свой файл отображения Hibernate следующим образом:

        <id
        name="Id"
        type="integer"
        column="id"
    >
        <generator class="com.mypackage.FlexibleIDGenerator"/>
    </id>

Еще одна деталь:Я добавил метод к своему базовому объекту с именем «GetOverriddenID ()», чтобы избежать путаницы в том, что я использую «обычный» идентификатор (в вызовах Update ()) или переопределенные.

Надеюсь, что это поможет.

1 голос
/ 04 октября 2011

Учитывая, что вы не можете изменить удаление строк, другим способом было бы написать собственный генератор идентификаторов, который получит новое значение последовательности, только если значение еще не назначено.См. Конец в разделе 5.1.2.2 справочного руководства для получения информации о написании собственного генератора.Я никогда не пробовал этого раньше, поэтому могу указать вам только общее направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...