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 连接(与主机、端口等而不是实例名称)。
我已经成功地从 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 连接(与主机、端口等而不是实例名称)。