AppEngine上的DataNucleus没有返回任何结果

时间:2016-06-13 12:57:12

标签: google-app-engine google-cloud-endpoints google-cloud-sql datanucleus

我只是尝试了一切,但是在运行在以下目标平台上运行的简单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

Java代码

通过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

JPA配置

这是我的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

1 个答案:

答案 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