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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top