Google 云 SQL + 没有 WTP 的 JPA

Google Cloud SQL + JPA without WTP

我已经成功地从 Java 连接到我的 Google 云 SQL 数据库。目前我一直在通过这样的方式验证这一点:

Connection conn = DriverManager.getConnection(getUrl());

然后从中检索准备好的语句等等。 getUrl() 是一种方法,returns url 的格式 Google 指定:"jdbc:google:mysql://xxx/xxx?user=xxx&password=xxx".

我想在我的数据库中使用 JPA。查看 Google 的文档,他们似乎推荐 WTP a.k.a。 Eclipse Web 工具平台 (https://developers.google.com/eclipse/docs/cloudsql-jpatools)。我不使用 Eclipse,我真的很想避免使用这个工具来做一些通常不需要任何 gui/wizard/plugin-thingy.

就应该很容易实现的事情。

我的 Java servlet 是用 Spring 编写的,我的应用程序配置如下所示:

@EnableWebMvc
@EnableScheduling
@EnableTransactionManagement
@EnableJpaRepositories("stuff")
@ComponentScan("stuff")
@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource driver = new DriverManagerDataSource();
        driver.setDriverClassName("org.postgresql.Driver"); //Obviously not working for Google Cloud SQL
        driver.setUrl(Config.getUrl()); // Same url as described above.
        driver.setUsername(/*omitted*/);
        driver.setPassword(/*omitted*/);
        return driver;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("stuff");
        factory.setPersistenceUnitName("PU");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

我的 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="PU">
        <class>stuff.Message</class>

        <properties>
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        </properties>

    </persistence-unit>

</persistence>

有什么方法可以修改我的 AppConfig.java+persistence.xml 以使其与 Google Cloud SQL 一起使用?如前所述,我希望跳过 Eclipse 插件。

如果您使用的是 AppEngine,您可能需要阅读 https://cloud.google.com/sql/docs/app-engine-connect and https://cloud.google.com/appengine/docs/java/cloud-sql/

在这里,您似乎正在尝试连接到 Google 云 SQL 实例而不使用 Google 云 SQL 驱动程序,但使用 Google 需要此驱动程序的连接字符串,如其示例中所述:

// Load the class that provides the new "jdbc:google:mysql://" prefix.
Class.forName("com.mysql.jdbc.GoogleDriver");

因此无法识别您的连接字符串(并且 PostgreSQL 驱动程序没有帮助)。

如果您不使用 AppEngine,请切换到 MySQL 驱动程序并删除连接字符串中的 "google",就像您使用标准 MySQL 连接(与主机、端口等而不是实例名称)。