Назад | Перейти на главную страницу

Гибернация в Google Cloud SQL: первое поколение -> второе поколение

Некоторое время я запускаю приложение Java + Hibernate на Google App Engine. База данных MySQL - это экземпляр Google Cloud SQL (первое поколение). Теперь я хочу обновить его до экземпляра «Второго поколения».

Если я это сделаю, EntityManager не может быть инициализирован, и он говорит, что некоторые классы не определены. Нужно ли мне вносить какие-либо изменения в конфигурацию?

Первое поколение использует MySQL 5.5, второе - MySQL 5.7.

Я предлагаю вам проверить имена пакетов и классы в файле конфигурации persistence.xml.

<persistence-unit name="Jondow">
<class>com.example.appengine.cloudsql.ClassName</class>

Затем где-нибудь в вашем коде вы получите этот класс, например, в функции doGet:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("Jondow", properties);
EntityManager em = emf.createEntityManager();

Убедитесь, что вы определили все таблицы в своей базе данных в этом файле и что где-то определен класс, который правильно отображает таблицу в базе данных. Я попробовал перейти с MySQL 5.5 первого поколения на MySQL 5.7 второго поколения, и мне просто нужно было изменить доступ к базе данных в pom.xml (имя экземпляра, пользователь, пароль). Затем Hibernate создал все таблицы в базе данных. Убедитесь, что у вас есть минимальный набор данных для вашего App Engine, потому что Hibernate создает таблицы, которые вы определили для вас, и у вас могут возникнуть проблемы с получением пустых таблиц. Также убедитесь, что у пользователя, которого вы используете, есть правильные разрешения для управления базой данных так, как вам нужно, потому что HIbernate не будет создавать таблицы, если у пользователя нет правильных разрешений.

По следующим ссылкам можно найти образец проекта в Hibernate [1] и документацию по Cloud SQL [2]. Я смешал их, и оба способа работают с одним и тем же файлом pom.xml. Я делюсь кодом для функции init (), которую вы можете заменить в [3] образце, функция doGet остается прежней, убедитесь, что вы используете правильные имена String.

Map<String, String> properties;
@Override
public void init() throws ServletException {

try {
  ApiProxy.Environment env = ApiProxy.getCurrentEnvironment();
  Map<String,Object> attr = env.getAttributes();
  String hostname = (String) attr.get("com.google.appengine.runtime.default_version_hostname");
  String url = hostname.contains("localhost:") ? System.getProperty("cloudsql-local") : System.getProperty("cloudsql");
  properties = new HashMap();
  if (!hostname.contains("localhost:")) {
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.GoogleDriver");

  } else {
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");

  }
  properties.put("javax.persistence.jdbc.url", url);
  log("connecting to: " + url);
  try {
    conn = DriverManager.getConnection(url);

  } catch (SQLException e) {
    throw new ServletException("Unable to connect to Cloud SQL", e);

  }
} finally {

}

}

Также вы можете проверить [4] и [5], чтобы узнать больше о Hibernate. Здесь [6] вы можете найти полезную информацию для перехода с экземпляра Cloud SQL первого поколения на экземпляр Cloud SQL второго поколения.

[1] https://github.com/GoogleCloudPlatform/appengine-cloudsql-native-mysql-hibernate-jpa-demo-java/blob/master/src/main/java/com/google/appengine/demos/HibernateJpaServlet.java

[2] https://cloud.google.com/appengine/docs/standard/java/cloud-sql/

[3] https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java8/cloudsql

[4] https://www.tutorialspoint.com/hibernate/hibernate_quick_guide.htm

[5] https://dzone.com/articles/spring-hibernate-google

[6] https://cloud.google.com/sql/docs/mysql/upgrade-db