我只是尝试了一切,但是在运行在以下目标平台上运行的简单SQL查询时,我没有收到任何结果:使用DataNucleus的Google AppEngine + Google Cloud SQL数据存储(全部在Google Cloud Platform上)。 我已经部署了一个基本的Java Servlet并设置了一个简单的MySql表。这是详细信息。最令人沮丧的是,我不知道如何获得更多信息以取得进展。所以非常感谢你的帮助。所以再一次,没有错误,结果集中没有结果。
当然,我100%确定表中有数据。我的数据库(MySql)在模式'vicparkhoney'中有以下表:
id, name, city, type1_price, type2_price
直接在MySql工作台中输入的以下查询给出了两个结果:
CREATE TABLE `mytable` ( `name` varchar(255) DEFAULT NULL);
结果:
SELECT * FROM vicparkhoney.mytable;
(即使在那些想知道我是否已经提交插入内容的人重新连接之后......)
这对您来说并不奇怪,以下查询返回一个结果:
name
===========
Name1
Name2
通过DataNucleus运行JPA查询时,我得不到相同的结果。这是我的Servlet代码:
SELECT * FROM vicparkhoney.mytable n WHERE n.name = 'Name1';
name
===========
Name1
这是Entity类的EntityManagerFactory emf = Persistence.createEntityManagerFactory("transactions-optional");
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select n from MyTable n where n.name = 'Name1'");
List results = q.getResultList();
Iterator iter = results.iterator();
MyTable n = null;
while (iter.hasNext()) {
n = (MyTable)iter.next();
}
em.close();
代码:
MyTable
这是我的persistence.xml:
package com.vicparkhoney.backend.bean;
import javax.persistence.*;
@Entity
@Table( name = "mytable" )
public class MyTable {
@Basic
@Id
private String name;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
我想知道是否有办法在日志中获取有关DataNucleus正在运行的确切SQL的更多信息。我用过:
<?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.api.jpa.PersistenceProviderImpl</provider>
<class>com.vicparkhoney.backend.bean.MyTable</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="datanucleus.mapping.Schema" value="vicparkhoney"/>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
</properties>
</persistence-unit>
</persistence>
日志:
DataNucleus.level=FINEST
DataNucleus.Datastore.Native=FINEST
答案 0 :(得分:1)
“Google AppEngine”最初只有自己的“NoSQL”数据库,称为GAE/Datastore
。谷歌提供了自己的DataNucleus
插件,允许持久化,称为 datanucleus-appengine.jar 。此数据存储区需要将datanucleus.ConnectionURL
设置为 appengine 。如果使用这个,那么你将使用非常旧的罐子,因为谷歌插件罐不适用于最近的任何东西。
他们随后添加了“Google CloudSQL”,它附带了MySQL/MariaDB
数据库。 DataNucleus项目提供了自己的插件来持久化,称为 datanucleus-rdbms.jar 。使用此功能,您可以使用最近的DataNucleus项目jar。此数据存储区需要将datanucleus.ConnectionURL
设置为以 jdbc 开头的内容。
您目前正在使用GAE /数据存储区数据库,而不是MySQL(因此您在MySQL中手动运行的测试都很好,但您还没有将持久层配置为使用它!)。您需要修复ConnectionURL并确保在CLASSPATH中有datanucleus-rdbms jar。此外,如果想要使用GAE /数据存储数据库,请阅读相关站点的文档(Google AppEngine;如果想要继续使用mySQL,请阅读DataNucleus itself。