JPA: сгенерировать код на основе автоматически увеличенного идентификатора - PullRequest
2 голосов
/ 18 июля 2011

У меня есть и сущность с двумя полями: идентификатор и код, как ...

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;

@Basic
@Column(name = "code", nullable = false)
private String code;

Я хотел бы создать код на основе идентификатора с автоинкрементом (используя Mysql в качестве базы данных).

Есть ли способ без использования таблицы для генерации ключей для столбца кода. * 1006 т.е. *

  • id = 1 код М-000-1
  • id = 2, код M-000-2 и т. Д.

Единственный способ, которым мне удалось это сделать, - использовать приведенный ниже скрипт. Что я не уверен, что это правильный путь.

getEntityManager().persist(myEntity);
getEntityManager().flush();
myEntity.setCode(myEntity.getCode()+myEntity.getId());
getEntityManager().merge(myEntity);

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

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

выглядит хорошо. Вы можете переместить его в обработчик @PostPersist.

1 голос
/ 18 июля 2011

Вы можете создать собственный генератор последовательностей, используя аннотацию @GenericGenerator. Это характерно для Hibernate, но известно, что оно работает в JPA.

@Id
@GeneratedValue(generator="custom-code-generator")
@GenericGenerator(name="custom-code-generator", strategy = "classname-of-generator",
parameters={...annotated parameters like the sequence name can be specified here ...})
@Column(name = "id")
private Integer id;

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

Использование аннотации @PostPersist также будет работать, поскольку идентификатор не сбрасывается в базу данных до тех пор, пока не будет сброшен EntityManager или не будет зафиксирована транзакция, связанная с EntityManager.

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

Вы можете попробовать с @PostPersist:

class EntityClass {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Basic
    @Column(name = "code")
    private String code;

    @PostPersist
    public void generateCode() {
        code = ("M-000-" + id);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...