JPA: Id столбец устанавливается как автоматически, так и вручную - PullRequest
3 голосов
/ 20 мая 2009

Я использую MySQL и имею следующую сущность:

class MyEntity {
    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="id")
    private Integer id;
}

Однако я все же хотел бы иметь возможность установить идентификатор вручную!

Проблема в том, что INSERT никогда не вставит столбец id. Например, когда делаем это:

MyEntity e = new MyEntity();
e.setId(15);
em.persist(e);
em.flush();
em.refresh(e);

Будут выполнены следующие запросы:

INSERT INTO myEntities (col1, col2, col3) VALUES (?, ?, ?)
SELECT id, col1, col2, col3 FROM myEntities WHERE (id = 15)

И, таким образом, идентификатор будет по-прежнему генерироваться автоматически, а refresh() результат в EntityNotFoundException.

Если я вообще не установлю @GeneratedValue, то этот случай будет работать нормально, но когда значение генерируется автоматически, LAST_INSERT_ID() вызываться не будет.

Можно ли вообще устанавливать столбцы идентификаторов как вручную, так и автоматически, как в MySQL?

Ответы [ 2 ]

2 голосов
/ 20 мая 2009

JPA не обслуживает этот сценарий (как и JDO); предполагается, что вы либо сами устанавливаете идентификатор, либо генерируете его с помощью предоставленных генераторов. DataNucleus имеет расширение, добавив @Extension (key = "Strategy-When-Notnull", value = "true") который будет генерировать значение, когда вы не установили значение «id», и использовать свое значение, если вы его указали. Может быть, другие реализации позволяют что-то подобное?

- Энди (DataNucleus)

0 голосов
/ 22 мая 2009

При использовании EclipseLink ручное назначение идентификаторов будет работать для последовательности на основе TABLE и последовательности объектов SEQUENCE, но не с IDENTITY.

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