我现在在 Google App Engine 上运行 Java + Hibernate 应用程序已有一段时间了。MySQL 数据库是 Google Cloud SQL(第一代)实例。现在我想将其升级为“第二代”实例。
如果我这样做,EntityManager 无法初始化,并且会提示某些类未定义。我需要进行任何配置更改吗?
第一代使用MySQL 5.5,第二代使用MySQL 5.7。
答案1
我建议您检查 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 函数保持不变,请务必检查您使用的字符串名称是否正确。
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 实例的有用信息。
[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