Java JPA (EclipseLink) Как получить следующее значение GeneratedValue перед сохранением фактической сущности? - PullRequest
2 голосов
/ 07 июля 2011

Я использую реализацию EclipseLink в JPA, и у меня возникла проблема.

Вот мой класс сущности:

@Entity
@Table(name = "attendances")
public class Attendance implements Serializable {<br>
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Short id;</p>

<code>....
</code>

В моей таблице MySQL (которая является основным хранилищем данных) я также установил флаг auto_increment.

Как я могу получить автоматически сгенерированное значение (id поле) перед сохранением сущности? Так что, если в таблице 3 сущности (id IN (1, 2, 3)), я хочу получить 4 в качестве следующего автоматически сгенерированного значения.

Единственный обходной путь, который у меня есть:

  1. Получить идентификатор сущности с наибольшим полем id.

Это все, что я могу сделать?

1 Ответ

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

Вы можете попробовать это, если используете JPA 2.0,

entityManagerFactory.getPersistenceUnitUtil().getIdentifier(attendance);

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Сам никогда не пробовал.

В противном случае вы можете изменить свою стратегию генерации идентификаторов на что-то, что может дать вам id перед сохранением сущности. Например, попробуйте использовать генератор таблиц для генерации id s. Здесь я нашел пример: Использовать генератор таблиц для генерации идентификатора . Тогда вы сможете прочитать значение из этой таблицы напрямую. Возможно, вам не удастся обработать это автоматически с помощью @Id, в итоге вы сами подсчитаете следующий id. Следовательно, вы можете использовать ту же идею, но выполнять всю работу самостоятельно и установить id при создании операции, и не позволять JPA генерировать ее.

Или вы можете использовать sequence, если поддерживается. В случае sequence вам также необходимо получить следующее значение самостоятельно и установить его вручную. Будьте готовы потерять пропущенные id s в случае отсутствия вставки или справиться с этим каким-либо образом.

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

...