2009年6月30日火曜日

GAE/JのJPA

GAE/JでBigTableをJPAで利用してみた。

① META-INF/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">

<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>

</persistence>


② EMF
package com.babukuma.gae.test.jpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EMF {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional");

private EMF() {
}

public static EntityManagerFactory get() {
return emfInstance;
}
}

③ エンティティ

package com.babukuma.gae.test.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import com.google.appengine.api.users.User;

@Entity
public class SimpleBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;

@Column
private User author;

@Column
private String content;

@Column(nullable = false)
private Date date;

public SimpleBoard(User author, String content, Date date) {
this.author = author;
this.content = content;
this.date = date;
}

public Long getId() {
return id;
}

public User getAuthor() {
return author;
}

public String getContent() {
return content;
}

public Date getDate() {
return date;
}

public void setAuthor(User author) {
this.author = author;
}

public void setContent(String content) {
this.content = content;
}

public void setDate(Date date) {
this.date = date;
}
}

④ テストコード

package com.babukuma.gae.test;

import java.io.IOException;
import java.util.Date;

import javax.persistence.EntityManager;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.babukuma.gae.test.entity.SimpleBoard;
import com.babukuma.gae.test.jpa.EMF;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

@SuppressWarnings("serial")
public class DataStoreTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

String content = req.getParameter("content");

System.out.println("content=" + content);
Date date = new Date();
SimpleBoard board = new SimpleBoard(user, content, date);

EntityManager manager = EMF.get().createEntityManager();
try {
System.out.println("before insert");
manager.persist(board);
System.out.println("after insert");
} catch (Exception e) {
e.printStackTrace();
} finally {
manager.close();
}

resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}


これ以外に簡単にできるんだな。。(^(エ)^)