2011-01-19 71 views

回答

41

更新: Spring 3.1将支持persistence.xml-JPA配置,请参阅Spring 3.1 M2: Configuration Enhancements


darioo的回答是不错的实际应用,而不是技术问题。

PersistenceProvider有两个工厂方法:

  • EntityManagerFactory createEntityManagerFactory(String emName, Map map) - 对于独立环境,persistence.xml是通过持久性提供解析。

  • EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) - 对于应用程序服务器环境,persistence.xml由应用程序服务器解析,其内容作为PersistenceUnitInfo传递。

Spring的LocalContainerEntityManagerFactoryBean模拟应用程序服务器环境。因此它自己分析persistence.xml,将其内容与应用程序上下文中的值合并,并使用第二种工厂方法将其传递给持久性提供程序。

然而,获得persistence.xml数据的过程是可配置的:

  • 您可以配置persistence.xml文件中使用persistenceXmlLocation属性的名称 - 为了避免与应用程序服务器的默认JPA初始化策略冲突,它是有用的。

  • 通过设置自定义PersistenceUnitManager策略,您可以完全覆盖PersistenceUnitInfo的来源。

所以,其实你可以在Spring中通过编写自定义PersistenceUnitManager配置JPA没有persistence.xml,虽然这样的管理者不可开箱。

+1

一个很好的答案,我会投你了,如果我没有用完所有的票为这一天。我认为OP不会在Spring内部进行挖掘,因为它似乎没有必要,也有点复杂。 – darioo 2011-01-19 14:52:22

7

persistence.xml在通过JPA使用Hibernate时需要,即使您使用的是Spring JPA。如果您直接使用Hibernate,则不需要persistence.xml

+1

为什么春天JPA与Hibernate作为JPA提供商需要persistence.xml文件? – Suvasis 2014-09-18 11:19:05

1

JPA规范没有描述任何需要该文件的地方,但是在EntityManagerFactory和EntityManager的约定的定义中以及实际上在整个规范中,persistence.xml文件被一遍又一遍地提及。

我最近不得不处理是否有可能在没有使用persistence.xml的情况下以编程方式配置JPA 2.0与Hibernate 3.6的问题。

我的结论是,这是不可能的,但你可以配置文件包含了非常最低配置。我确定该文件必须至少包含持久性单元的名称。剩下的信息可以编程方式提供给实体管理器工厂作为参数。

我从来没有使用弹簧,虽然,所以我不知道它是否使用任何技巧来解决这个问题。

相关问题