Как вы синхронизируете идентификатор объекта Java с соответствующей строкой БД? - PullRequest
2 голосов
/ 11 января 2011

Как синхронизировать идентификатор объекта Java с соответствующей строкой БД после вызова entityManager.persist(object);

и совершил сделку? Если вы используете какую-либо стратегию, с помощью которой БД устанавливает идентификатор, вам нужно получить этот идентификатор из БД и установить его для объекта, если вы хотите использовать объект в будущих запросах. Это:

entityManager.refresh(object);

не работает, потому что он использует идентификатор для запроса объекта, и это то, чего не хватает. Единственное, что я могу придумать, это запросить у db для объекта его уникальные атрибуты, а затем установить id для объекта.

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

Ответы [ 3 ]

4 голосов
/ 11 января 2011

persist() делает экземпляр управляемым, что означает, что id будет там после вызова persist(), , когда транзакция совершена .Вы можете проверить это, сделав это,

System.out.println(someEntity.getId()); // null at this point of time
em.persist(someEntity)
System.out.println(someEntity.getId()); // should print the id
1 голос
/ 11 января 2011

persist изменяет постоянный объект, если стратегия id является той, которая генерируется базой данных как последовательность, тогда идентификатор будет установлен в постоянном объекте.

0 голосов
/ 11 января 2011

Лично я не позволяю базе данных автоматически генерировать мои идентификаторы. Вместо этого я использую случайные 128-битные числа и устанавливаю их сам во время создания начального объекта на своем прикладном уровне. Я храню их в VARBINARY (16) или, предпочтительно, BINARY (16), если мой движок базы данных поддерживает это.

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

http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String,%20int)

В частности обратите внимание на 2-й параметр:

Connection.prepareStatement(String sql, int autoGeneratedKeys)

Предположительно, есть какой-то способ заставить Hibernate вызвать второй параметр со значением Statement.RETURN_GENERATED_KEYS!

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