Различные типы столбцов для разных баз данных с JPA

Есть ли возможность определить с помощью JPA разные типы столбцов в зависимости от используемой базы данных?

Мне нужно сохранить id как uuid, и он должен быть protable. Это проблема. PostgreSQL имеет "uuid", MSSQL "uniqueidentifier", и Oracle ничего не имеет, поэтому я должен использовать "RAW".

Есть ли у кого-нибудь идея и может мне помочь?

Изменить: В настоящее время идентификаторы создаются с помощью java.util.UUID и хранятся в базе данных как varchar. Но из-за проблем с производительностью с этим типом данных я хочу сохранить идентификаторы как тип uuid. Для Oracle необходимо использовать тип RAW, потому что не существует типа uuid. Как я могу сказать, что JPA использует тип uuid с типами PostgreSQ/MSSQL и RAW с Oracle?

2 ответа

Я бы использовал SequenceGenerator. Подробнее см. этот ответ. Вам нужно будет сделать один шаг. генератор для каждого объекта, чтобы убедиться, что вы не получаете проблем с concurrency. Также убедитесь, что вы установили хорошее/не существующее начальное значение.


Вы можете использовать java.util.UUID для генерации ваших uuids и сохранить его в характерном типе символов (60). Теперь, поскольку вы хотите быть первичным ключом, должно быть полезно автоматически генерировать его. Таким образом, вы можете добавить в свой класс прослушиватель объектов в PrePersist:

@EntityListeners({ AbstractEntity.AbstractEntityListener.class})
public class Entity {
 public static class AbstractEntityListener {
 @PrePersist
 public void onPrePersist(Entity entity) {
 entity.uid();
 }
 }
 private String uid() {
 if (uid == null)
 uid = UUID.randomUUID().toString();
 return uid;
 }
}

Обратите внимание, что я не тестировал это. Таким образом, он может не работать на 100%.

licensed under cc by-sa 3.0 with attribution.