0

嘿伙计们,我的目标是使用取决于正在使用的数据库的属性创建一个 EntityManager。我在所有的谷歌搜索中都看到过类似的事情(为了这个问题,我使代码更基本):

@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 语句时遇到了问题。每当插入完成时,我都会得到一个重复的主键异常......每次!谁能解释为什么会发生这种情况?谢谢-布拉德

4

2 回答 2

1

EntityManager用_@PersistenceContext(unitName="app-x")

因此,您不需要创建新的实体管理器和工厂 - 一切都由您的容器自动处理。

于 2010-03-09T09:06:04.823 回答
1

容器管理的环境中,您可以直接注入EntityManager

要获取 EntityManager 实例,请将实体管理器注入应用程序组件:

@PersistenceContext
EntityManager em;

如果您需要处理不同的持久性单元(因此需要处理多个EntityManager实例),请在 中声明它们persistence.xml并通过其名称获得正确的EntityManager注入:

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

更新:根据指定数据库(也提到了这篇文),EclipseLink 可能能够自动检测数据库平台,并且eclipselink.target-database是可选的:

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

如果这适用于 Oracle 和 PostgreSQL(我的理解是它应该),客户只需要设置一个 IMO 理想场景的数据源。

于 2010-03-09T18:17:29.910 回答