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 (с именем хоста, портом и т. Д. Вместо имени экземпляра).

Другие вопросы по тегам