NaturalId, как это работает? - PullRequest
0 голосов
/ 14 июля 2011

У меня проблема с nativeid, и я не знаю, правильно ли я поступаю.

У меня есть класс Aircraft, у которого есть сгенерированный идентификатор. Но его собственным идентификатором является серийный номер (целое число) и модель (пользовательский класс), как показано ниже:

public class Aircraft{

@Id @GeneratedValue(strategy=GenerationType.AUTO,generator="COD_NS_AENV")
@Column(name="COD_NS")
private Integer id;
@Column(name="NUM_IDENT_NS_AENV")
@NaturalId
private Integer serialNumber;
@ManyToOne
@NaturalId
private Model model;

.
.
.
}

Я загружаю этот класс из XML и сохраняю в базу данных, например:

.
.
.
Aircraft aircraft= (Aircraft)xstream.fromXML(reader);
Session session =  HibernateUtil.openSession();
Transaction t = session.beginTransaction();

session.saveOrUpdate(aircraft.getModelo());
session.saveOrUpdate(aircraft);
t.commit();
session.close();

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

Я переопределил метод equals () для проверки атрибутов serialNumber и Model, но он никогда не вызывается.

Я не знаю, как заставить Hibernate понять, что объект с serialNumber и моделью - это NativeId.

Заранее спасибо!

Александр

1 Ответ

0 голосов
/ 14 июля 2011

Скорее всего, Hibernate просто использует свойство @Id и каждый раз генерирует новое значение. Это происходит потому, что вы считываете свой объект из XML, а id не в XML, я полагаю. Я не думаю, что естественный идентификатор будет хорошо сосуществовать с суррогатным автоматически созданным идентификатором. А для saveOrUpdate Hibernate просто посмотрит на id, чтобы определить, является ли объект новым.

Подробнее о форумах Hibernate .

...