usar de EntityManagerFactory causando duplicados exceções chave primária
-
18-09-2019 - |
Pergunta
Ei, meu objetivo é criar um EntityManager usando propriedades dependentes de qual banco de dados está em uso. Eu vi algo como isto feito em todas as minhas pesquisas no Google (eu fiz o código mais básico para o propósito desta questão):
@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);
}
Este obras e eu posso carregar as propriedades do Oracle ou PostgreSQL com sucesso e eu posso selecionar a partir de qualquer banco de dados. No entanto, estou correndo em problemas ao fazer declarações INSERT. Sempre que um INSERT é feito recebo uma exceção de chave primária duplicado .. cada vez! Alguém pode lançar alguma luz sobre por que isso pode estar acontecendo? obrigado -Brad
Solução
Em um gerenciada por contêiner ambiente, você pode injetar diretamente uma EntityManager
:
Para obter uma instância EntityManager, injetar o gerenciador de entidade no componente de aplicação:
@PersistenceContext EntityManager em;
Se você precisa lidar com diferentes unidades persistência (e, portanto, várias instâncias EntityManager
), declaram-los no persistence.xml
e obter o EntityManager
direito injetado por seu nome:
@PersistenceContext(unitName = "MyFirstPU")
EntityManager em;
Update: De acordo com o Especificando o banco de dados (e também mencionou esta post ), EclipseLink pode ser capaz de detectar automaticamente a plataforma de banco de dados eo eclipselink.target-database
é opcional:
Se você estiver usando o provedor de persistência padrão, as tentativas de provedor para detectar automaticamente o tipo de banco de dados com base nos metadados de conexão.
Se isso funciona com Oracle e PostgreSQL (e meu entendimento é que deveria), o cliente só tem que configurar uma fonte de dados que é IMO o cenário ideal.
Outras dicas
Anotar seu EntityManager
com @PersistenceContext(unitName="app-x")
Assim você não precisará criar novos gestores e fábricas entidade -. Tudo é manipulada pelo seu recipiente