Google Cloud SQL + JPA без WTP
Мне удалось подключиться к моей базе данных Google Cloud SQL из Java. В настоящее время я проверяю это следующим образом:
Connection conn = DriverManager.getConnection(getUrl());
Затем извлеките подготовленное утверждение из этого и так далее. getUrl() - это метод, который возвращает URL в указанном Google формате: "jdbc:google:mysql://xxx/xxx?user=xxx&password=xxx".
Я хотел бы использовать JPA с моей базой данных. Глядя на документацию Google для этого, они, похоже, рекомендуют WTP, также известный как Платформа веб-инструментов Eclipse ( https://developers.google.com/eclipse/docs/cloudsql-jpatools). Я не использую Eclipse, и я действительно хотел бы избежать использования этого инструмента для чего-то, чего обычно должно быть очень легко достичь без какого-либо gui / wizard / plugin-thingy.
Мой Java-сервлет написан на 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 Plugin.
1 ответ
Если вы используете AppEngine, вы можете прочитать https://cloud.google.com/sql/docs/app-engine-connect и https://cloud.google.com/appengine/docs/java/cloud-sql/.
Здесь, кажется, вы пытаетесь подключиться к экземпляру Google Cloud SQL без использования драйвера Google Cloud SQL, но с помощью строки подключения Google, для которой требуется этот драйвер, как описано в их примере:
// Load the class that provides the new "jdbc:google:mysql://" prefix.
Class.forName("com.mysql.jdbc.GoogleDriver");
Таким образом, ваша строка подключения не распознается (и драйвер PostgreSQL не помогает).
Если вы не используете AppEngine, переключитесь на драйвер MySQL и удалите "google" в строке подключения, как если бы вы использовали стандартное соединение MySQL (с именем хоста, портом и т. Д. Вместо имени экземпляра).