Нарушение ограничения гибернации / откат ошибки - PullRequest
0 голосов
/ 23 октября 2009

Я столкнулся со странной ошибкой в ​​спящем режиме, скорее всего, из-за ее неправильного использования, но мне было интересно, есть ли способ найти основную причину и, возможно, устранить ее.

В настоящее время у меня есть иерархия классов, которая выглядит следующим образом:



@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "tbl_class_a)
public ClassA {
    ...
    private int propA;
    ...
}

@Entity 
@Table(name = "tbl_class_b")
public ClassB extends ClassA {
    ...
    @Column(unique = true)
    private int propB;
    ...
}

@Entity
@Table(name = "tbl_class_c")
public ClassC extends ClassC {
    ...
    private int propC;
    ...
}

Я тщательно протестировал постоянство и удаление объектов всех трех классов, и все, кажется, работает нормально, пока я не рассмотрю ограничения на свойства, особенно. что касается настойчивости.

Теперь я создаю экземпляр объекта newObj класса C со значением propB, равным полностью готовому сохраненному объекту, у которого все готовые имеют это значение для его propB. Я пытаюсь сохранить его, и, как и ожидалось, выдается нарушение ограничения, и я пытаюсь откатить транзакцию. Я ожидаю, что все следы newObj будут удалены, но происходит нечто очень странное. Все ссылки на newObj в таблицах для класса C и класса B действительно удалены, но свойства в таблице для класса A остаются, и, насколько я могу судить, безвозвратно. Почему ??

1 Ответ

1 голос
/ 23 октября 2009

движок MyISAM для MySQL не поддерживает транзакции .

Hibernate вставляет строки в «объединенной» иерархии по порядку - от родителя к потомку. Итак:

  1. вставляется строка в таблицу A
  2. Hibernate пытается вставить строку в таблицу B и терпит неудачу (строка не вставлена)
  3. нет попытки вставить строку в таблицу C (потому что сбрасывание сеанса не удалось, и возникла исключительная ситуация)

Отсутствие транзакций означает отсутствие отката, поэтому вы получите строку в таблице A.

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