Seam / Hibernate / JPA - дублирование исключения первичного ключа? - PullRequest
1 голос
/ 29 марта 2011

У меня есть объектная модель, которая сохраняется с использованием Seam и JPA (Hibernate).Это выглядит примерно так:

@Entity(name = "MyObject")
public class MyObject {

...

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_myobj")
@SequenceGenerator(name = "seq_myobj", sequenceName = "seq_myobj")
private Long id = null;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
   private MySubObject subObjA=null;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
   private MySubObject subObjB=null;

...

}

@Entity(name = "MySubObject")
public class MySubObject {

...

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_mysubobj")
@SequenceGenerator(name = "seq_mysubobj", sequenceName = "seq_mysubobj")
private Long id = null;

}

Я правильно определил свои @ManyToOne аннотации и все.Однако, если я попытаюсь сохранить экземпляр MyObject, в котором установлены оба параметра subObjA и subObjB, я получу исключение, сообщающее, что у меня есть дублированный первичный ключ, один из подчиненных объектов.Что вызвало бы такое поведение?Оба объекта имеют идентификаторы типа SEQUENCE, и у меня нет проблем, если я устанавливаю один или другой.Только когда я установил оба, я получаю исключение.

Я использую Seam 2.2, а моя внутренняя база данных - PostgreSQL.Есть мысли о том, что может быть причиной этого странного поведения?Я думал, что оба объекта будут сохранены как часть одной транзакции, и что правильные первичные ключи будут назначаться автоматически.Как я уже сказал, если я поставлю только один из объектов, это не проблема.Это происходит только тогда, когда я устанавливаю их обоих.Буду признателен за любую помощь, которую вы можете оказать.

РЕДАКТИРОВАТЬ Однако я заметил странное поведение при тестировании различных вещей.Если я создаю MyObject программно и устанавливаю все его свойства (включая subObj), он сохраняется без проблем.Однако, если я ввожу свойства с помощью формы, я получаю сообщение об ошибке.Может ли это быть как-то связано с транзакциями?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

Пробежал через ряд тестов и различных сценариев и нашел случаи, когда это работает. Итак, похоже, что в моем классе действий есть ошибка, когда мне нужно отправить и сохранить в базе данных.

0 голосов
/ 30 марта 2011

Если вы переопределяете equals / hashCode в классе MySubObject, убедитесь, что эти методы проверяют только суррогатный ключ id (в таком случае вам следует избегать их полностью).

Если методы equals / hashCode работают с некоторыми свойствами бизнес-ключей, перед сохранением убедитесь, что эти ключи уникальны.

...