目前能够通过简单的配置就可以使用的guice 模块,我所知的是这两个:guice-persis和warp-persist。
warp-persist支持的持久化框架相对多一些,包括hibernate/jpa/db4o等,并且其Dynamic Finder非常有特色,但是这个项目似乎已经停了,并且其相关的特点由guice-persist继承了(这两个persist框架的开发者好像与sitebricks的开发者是同一人?),只是支持的持久化持久化框架只有jpa。
虽然warp-persist功能更丰富,文档也要完善一些,而guice-persist的文档基本上可以说很简单,功能也比较少,但为了避免以后重复学习,我还是选择了guice-persist。
那么,先来说一下在sitebricks中的相关配置。需要了解sitebricks本身的配置的,请猛击这里和这里。
1、我建立了两个类来配置sitebricks: BricksListener.java和BricksModule.java:
BricksListener.java:
public class BricksListener extends GuiceServletContextListener { protected Injector getInjector() { System.out.println("\n>>>[BIRCKS] Sitebricks web application demo started."); return Guice.createInjector(new BricksModule()); } }
BricksModule.java:
public class BricksModule extends SitebricksModule { @Override protected void configureSitebricks() { install(new JpaPersistModule("myFirstJpaUnit").addFinder(UserFinder.class));//这里加入Guice-persis的JpaPersistModule bind(FlashCache.class).to(HttpSessionFlashCache.class).in( Scopes.SINGLETON); at("static/default.css").export("bricks.css"); at("/").show(Home.class); at("/flow").show(Flow.class); at("/hello").serve(Hello.class); embed(NewCard.class).as("Card"); } //下面是实现jpa持久化filter的配置 @Override protected SitebricksServletModule servletModule() { return new SitebricksServletModule() { @Override protected void configurePreFilters() { filter("/*").through(PersistFilter.class); } }; } }
2、不要忘了在pom.xml加上guice-persist的依赖和建立persistence.xml。
pom.xml:
<dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-persist</artifactId> <version>${guice.version}</version> </dependency> <!--我使用的测试数据库及jpa2实现是objectdb--> <dependency> <groupId>com.objectdb</groupId> <artifactId>objectdb</artifactId> <version>${objectdb.version}</version> </dependency>
persistence.xml:
<?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>com.objectdb.jpa.Provider</provider> <!-- JPA entities must be registered here --> <class>org.northstar.bricks.domain.User</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.url" value="my.odb"/> <property name="javax.persistence.jdbc.user" value="admin" /> <property name="javax.persistence.jdbc.password" value="admin" /> </properties> </persistence-unit> </persistence>
我用的objectdb数据库,以内嵌的方式运行。
3、注意persistence-unit在配置中的一致性,比如我用的是"myFirstJpaUnit",那么在sitebricks的配置中是这样的(见上面的java代码),并且这一句必须在其他语句之前,尤其是页面显示和与数据库操作的绑定语句之前 :
install(new JpaPersistModule("myFirstJpaUnit"));
在persistence.xml是这样配置的:
<persistence-unit name="myFirstJpaUnit" transaction-type="RESOURCE_LOCAL">
4、开始应用。
建立一个Entity,比如:User.java:
@Entity public class User implements Serializable{ /** * */ private static final long serialVersionUID = 7158126725092237523L; @Id @GeneratedValue private Long id; private String name; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
5、建立一个接口Finder, 比如:UserFinder。这里有一个地方需要注意:必须通过returnAs指定取得结果集的类型,如果结果是唯一的则可以不用指定,其默认返回类型是Collection。
UserFinder.java:
public interface UserFinder { @Finder(query="select u from User u", returnAs=ArrayList.class) ArrayList<User> listAll(); }
注意要在sitebricks配置中注册,即addFinder(见上面完整的代码):
install(new JpaPersistModule("myFirstJpaUnit").addFinder(UserDao.class));
当然,需要创建数据库,那么来个简单的:
UserDao.java:
public class UserDao { @Inject private EntityManager em; @Transactional public void createNewUser() { User user = new User(); user.setName("test"); user.setPassword("123456"); em.persist(user); } }
页面类Home.java:
@Decorated public class Home extends Decorator { private List<User> users; @Inject private UserDao dao; @Inject private UserFinder finder; @Get public void get() { // Load the list of cards in this HTTP get handler... dao.createNewUser(); users = finder.listAll(); } public List<User> getUsers(){ return users; } @Override public String getPageTitle() { return "Home Page"; } }
页面模板Home.html:
<!DOCTYPE HTML> <html> <head> <title>bricks - Home page</title> <meta charset="UTF-8" /> </head> <body> <div> <ol> @Repeat(items=users, var="user") <li>${user.name}</li> </ol> </div> </body> </html>