I have a web application that works fine in the following environment
- GWT 2.4.0
- RestEasy 2.3.2.Final JAX-RS and JAXB
- Hibernate JPA 2.0 (hibernate-entitymanager + hibernate-validator) 4.2.0.Final
- MySQL 5.5.22 on localhost (Ubuntu 12.04)
- Tomcat VMware 2.6 Server
The application successfully works with JAX-RS, JAXB, the Jackson JSON provider, Hibernate JPA annotations mixed together in the same DTO.
I am trying to port it to GAE CloudSQL. I encounter MySQL access errors. I had to change the ORM from Hibernate to EclipseLink 2.3.2.
Reminder
I respectfully demand that the defendants not speculate about the possibility of errors in my code, and do not solve the question - how to port JPA to Hibernate on EclipseLink. If you donβt think that my setup or code suitable for Hibernate requires changes to work with GAE CloudSQL. The reason is that the application is running Hibernate.
Please do not provide instructions on how to get Hibernate to work with GAE CloudSQL if it is not associated with Hibernate JPA 2.0. I understand that there is an example on the Internet on how to use Hibernate with CloudSQL, but without JPA.
It would be very helpful if you had information on how to get DataNucleus JPA 2.0 to work with GAE CloudSQL. I could not get it to work, so I use EclipseLink.
, MySQL Eclipse datasource explorer, SQL Explorer SQL Squirrel Client. , /. , MqSQL.
mysql.db, localhost.localdomain.
/
-Drdbms.url = jdbc: mysql://localhost: 3306/Site? User = site & password = random & useInformationSchema = true & useUnicode = true & characterEncoding = UTF8 & useServerPrepStmts = true, " MySQL " http://developers.google.com/cloud-sql/docs/developers_guide_java.
JPA 2.0, 1.0.
CloudSQL, localhost MySQL Ubuntu 12.04. CloudSQL ().
, persistence.xml? , EMF ? , GAE EMF, Hibernate? , DataNucleus?
, . .
java.security.AccessControlException: ( "java.net.SocketPermission" "localhost" "resolve" ):
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:126)
at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:134)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2411)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:126)
at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:134)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:190)
at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:98)
... 55 more
Caused by: java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost" "resolve")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:252)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1048)
at java.net.InetAddress.getAllByName0(InetAddress.java:1203)
at java.net.InetAddress.getAllByName(InetAddress.java:1127)
at java.net.InetAddress.getAllByName(InetAddress.java:1063)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:247)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="Site" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.blessedgeek.site.jaxrs.dto.Node</class>
<properties>
<property name="javax.persistence.jdbc.user" value="site" />
<property name="javax.persistence.jdbc.password" value="random" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Site" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property>
</properties>
</persistence-unit>
</persistence>
maven
<properties>
<resteasy.version>2.3.2.Final</resteasy.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>com.smartgwt</groupId>
<artifactId>smartgwt</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.smartgwt</groupId>
<artifactId>smartgwt-skins</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.mvp4g</groupId>
<artifactId>mvp4g</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
</dependencies>
AppEngine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application></application>
<version>1</version>
<threadsafe>true</threadsafe>
<static-files>
<include path="**" />
<include path="**.nocache.*" expiration="0s" />
<include path="**.cache.*" expiration="365d" />
<exclude path="**.gwt.rpc" />
</static-files>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<async-session-persistence enabled="true" />
</appengine-web-app>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Blessed Geek Site</display-name>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/site</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/site/*</url-pattern>
</servlet-mapping>
</web-app>
DTO
@Entity
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement (name="node")
@XmlType(propOrder = { "id", "name", "description", "iconURL", "parentID", "active", "type"})
public class Node
implements Serializable{
public enum Type{
VIEW, ROOTNode, FOLDER, LEAF
}
@XmlAttribute
@Id
@GeneratedValue
private Long id;
@XmlAttribute
private String name;
@XmlAttribute
private String description;
@XmlAttribute
private String iconURL;
@XmlAttribute
private long parentID;
@XmlAttribute
private boolean active;
@XmlAttribute
@Enumerated(EnumType.STRING)
private Type type;
public Node() {
super();
}
public Node(String name, String description) {
super();
this.name = name;
this.description = description;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getIconURL() {
return iconURL;
}
public void setIconURL(String iconURL) {
this.iconURL = iconURL;
}
public long getParentID() {
return parentID;
}
public void setParentID(long parentID) {
this.parentID = parentID;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
}
2012/05/16:
jdbc com.google.appengine.api.rdbms.AppEngineDriver persistence.xml. .