Injector injector = Guice.createInjector(..., new JpaPersistModule("myFirstJpaUnit"));在JPA中, 在位于META-INF下配置你的persistence.xml文件,或者在classpath中(如果文件在jar中,那么此文件应该jar的根目录中) . 在这个文件中要大概的声明一些持久化单元,这些单元可能在不同的环境中(例如位于不同的数据库中),这里是一个简单的JPA配置的例子 :
<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <!-- A JPA Persistence Unit --> <persistence-unit name="myFirstJpaUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- JPA entities must be registered here --> <class>com.wideplay.warp.jpa.JpaTestEntity</class> <properties> <!-- vendor-specific properties go here --> </properties> </persistence-unit> </persistence>告诉Guice持久化模块你要使用哪些持久化单元,在创建你的模块时你需要指定这些单元的名称:
Injector injector = Guice.createInjector(..., new JpaPersistModule("myFirstJpaUnit"));最后,你必须决定持久化服务何时启动(调用PersistService的start()方法)。 .我通常用一个简单的启动类(initalizer)在我需要的时机来触发:
public class MyInitializer { @Inject MyInitializer(PersistService service) { service.start(); // At this point JPA is started and ready. } }
<persistence-unit name="myFirstJpaUnit" transaction-type="RESOURCE_LOCAL">
一旦你注入器被创建,你以在你的持久化服务中任意注入和使用EntityManager :
import com.google.inject.persist.Transactional; import javax.persistence.EntityManager; public class MyService { @Inject EntityManager em; @Transactional public void createNewPerson() { em.persist(new Person(...)); } }
这是已知的session-per-transaction策略. 如果想了解更多关于事务和工作单元的信息,可以看“这里”.
注意:如果你为MyService加上 @Singleton注解,那么你需要使用Provider<EntityManager>方式进行注解来替换现在的方式。
public class MyModule extends ServletModule { protected void configureServlets() { install(new JpaPersistModule("myJpaUnit")); // like we saw earlier. filter("/*").through(PersistFilter.class); } }