использование EntityManagerFactory вызывает дублирование исключений первичного ключа - PullRequest
0 голосов
/ 09 марта 2010

Эй, ребята, моя цель - создать EntityManager, используя свойства, зависящие от того, какая база данных используется. Я видел нечто подобное во всех моих поисках в Google (для этого вопроса я сделал более простой код):

@PersistenceUnit
private EntityManagerFactory emf; 
private EntityManager em;
private Properties props;

@PostConstruct
public void createEntityManager(){

//if oracle set oracle properties else set postgres properties

emf = Persistence.createEntityManagerFactory("app-x");
em = emf.createEntityManager(props);
}

Это работает, и я могу успешно загрузить свойства Oracle или Postgres и выбрать из любой базы данных. ОДНАКО, я сталкиваюсь с проблемами при выполнении операторов INSERT. Всякий раз, когда INSERT делается, я получаю исключение дубликата первичного ключа .. каждый раз! Может кто-нибудь пролить свет на то, почему это может происходить? Спасибо -Brad

Ответы [ 2 ]

1 голос
/ 09 марта 2010

В управляемой контейнером среде вы можете напрямую добавить EntityManager:

Чтобы получить экземпляр EntityManager, введите менеджер сущностей в компонент приложения:

@PersistenceContext
EntityManager em;

Если вам нужно иметь дело с различными единицами персистентности (и, таким образом, с несколькими EntityManager экземплярами), объявите их в persistence.xml и получите право EntityManager, введенное его имя:

@PersistenceContext(unitName = "MyFirstPU")
EntityManager em;

Обновление: Согласно Указание базы данных (а также упомянутое сообщение в блоге ), EclipseLink может иметь возможность автоматического определения платформы базы данных и eclipselink.target-database необязательно:

Если вы используете поставщик постоянства по умолчанию, он пытается автоматически определить тип базы данных на основе метаданных подключения.

Если это работает с Oracle и PostgreSQL (и я так понимаю, так и должно), клиенту потребуется только настроить источник данных, который является IMO идеальным сценарием.

1 голос
/ 09 марта 2010

Аннотируйте свой EntityManager с помощью @PersistenceContext(unitName="app-x")

Таким образом, вам не нужно создавать новых менеджеров и фабрик сущностей - все автоматически обрабатывается вашим контейнером.

...