Android プロジェクトとアプリ エンジン接続プロジェクトがあります。以下を使用しています: JPA v2、App Engine 1.7.6、Java 1.7 コンパイラ、Eclipse 4.2 Juno、EclipseLink 2.4.x
Cloud sql db を使用しています。JPA および DB Persective ウィンドウで正常に接続し、データを正常にクエリすることができます。SQL 開発を CLOUD Sql db に接続するようにアプリ エンジンをセットアップしました。
次のように定義された1つのテーブルがあります。
CREATE Table Test(codeid varchar(3) NOT NULL,codedesc varchar(20) NOT NULL,PRIMARY KEY (codeid));
エンティティ クラスは次のとおりです。
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String codeid;
private String codedesc;
public Test() {
}
public String getCodeid() {
return this.codeid;
}
public void setCodeid(String codeid) {
this.codeid = codeid;
}
public String getCodedesc() {
return this.codedesc;
}
public void setCodedesc(String codedesc) {
this.codedesc = codedesc;
}
}
エンドポイント クラスは次のとおりです。
@Api(name = "testendpoint" , version = "v1")
public class TestEndpoint {
/**
* This method lists all the entities inserted in datastore.
* It uses HTTP GET method and paging support.
*
* @return A CollectionResponse class containing the list of all entities
* persisted and a cursor to the next page.
*/
@ApiMethod( httpMethod = "GET", name = "listtest.list", path = "ch/list")
@SuppressWarnings({ "unchecked", "unused" })
public CollectionResponse<Test> listTest(
@Nullable @Named("cursor") String cursorString,
@Nullable @Named("limit") Integer limit) {
EntityManager mgr = null;
Cursor cursor = null;
List<Test> execute = null;
try {
mgr = getEntityManager();
Query query = mgr.createQuery("select x from Test x");
if (cursorString != null && cursorString != "") {
cursor = Cursor.fromWebSafeString(cursorString);
query.setHint(JPACursorHelper.CURSOR_HINT, cursor);
}
if (limit != null) {
query.setFirstResult(0);
query.setMaxResults(limit);
}
execute = (List<Test>) query.getResultList();
cursor = JPACursorHelper.getCursor(execute);
if (cursor != null)
cursorString = cursor.toWebSafeString();
// Tight loop for fetching all entities from datastore and accomodate
// for lazy fetch.
for (Test obj : execute);
}
finally
{
mgr.close();
}
return CollectionResponse.<Test> builder().setItems(execute).setNextPageToken (cursorString).build();
}
private boolean containsCodeheader(Test test) {
EntityManager mgr = getEntityManager();
boolean contains = true;
try {
Test item = mgr
.find(Test.class, test.getCodeid());
if (item == null) {
contains = false;
}
} finally {
mgr.close();
}
return contains;
}
private static EntityManager getEntityManager() {
return EMF.get().createEntityManager();
}
}
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_2_0.xsd" version="2.0">
<persistence-unit name="transactions-optional" transaction-type="RESOURCE_LOCAL">
<provider></provider>
<class>com.testApp.Test</class>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
私がやろうとしているのは、エンドポイントを実行してレコードのリストを取得することです。次を実行すると、コンソールにエラーが表示されません。
ローカルホスト:8888/_ah/api/testendpoint/v1/ch/list
テーブルにレコードがあることがわかっている場合、Google Chrome で次のように表示されます。
{
"items" : [ ]
}
さらに情報が必要な場合はお知らせください。
さらにテストを行ったところ、上記の例は、以前にゼロから作成した別のテスト アプリ エンジン プロジェクトで機能することがわかりました。私が見つけた違いは、壊れたアプリ エンジンをローカルで実行すると、コンソール ウィンドウに次の警告が表示されることです。これは、動作中のテスト アプリにはありません。
バッキング ストア \war\WEB-INF\appengine-generated\local_db.bin が存在しません。作成されます。