2010-03-09 37 views
0

嘿家伙们,我的目标是创建一个EntityManager使用属性取决于哪个数据库正在使用。我见过这样的事情在我所有的谷歌搜索做了(我使代码更基本的对这个问题的目的):使用EntityManagerFactory导致重复的主键异常

@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

回答

1

container-managed环境中,您可以直接注入一个EntityManager

为了获得一个EntityManager实例,注入实体管理器到应用程序组件:

@PersistenceContext 
EntityManager em; 

如果您需要处理不同的persistence units(并因此处理几个EntityManager个实例),在persistence.xml中声明它们并获得正确的EntityManager注射用它的名字:

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

更新:根据Specifying the Database(也提到了这一点blog post)的EclipseLink可能能够自动检测数据库平台和eclipselink.target-database是可选的:

如果使用默认持久性提供程序,则提供程序将尝试根据连接元数据自动检测数据库类型。

如果这适用于Oracle和PostgreSQL(而且我的理解是它应该),那么客户只需要设置一个IMO的数据源即可。

+0

我的最终目标是让我的应用程序检测正在使用哪种类型的数据库(在glassfish中设置)并相应地设置EntityManager。我的研究指出使用EntityManagerFactory是最好的方法。你怎么看? – bradd 2010-03-10 18:47:51

+0

@bradd为什么你的应用需要检测数据库?你能详细解释一下吗? – 2010-03-10 18:58:34

+0

我们的目标是让我们的客户能够将glassfish配置为使用postgres或oracle,而不必担心修改persistence.xml文件。我们也希望远离为不同数据库创建不同版本的应用程序。 – bradd 2010-03-10 19:43:38