无法使用 MySQL 在 GlassFish 5 服务器中从模型 @Entity 类 生成数据库模式
Cannot generate database schemas from model @Entity classes in GlassFish 5 server using MySQL
你好,我在启用从 java 模型 @Entity classes 自动生成数据库表时遇到了问题。我几乎什么都试过了。
我首先在 Intellij Idea 中创建了 maven 项目我已经下载了我正在使用的 JavaEE 8 api 实现。
我正在使用 Glassfish 5.0 服务器作为 java ee 8 实现提供程序和 MySQL 数据库。
我的项目结构:
我的 pom.xml 看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zerg.web</groupId>
<artifactId>PlanYourTime</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
我的模型@Entity class 我想在我的 MySQL 数据库中生成表。
package model;
import javax.persistence.*;
@Entity
@TableGenerator(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USERID")
private int userId;
@Column(name = "USERNAME")
private String username;
@Column(name = "PASSWORD")
private String password;
@Column(name = "EMAIL")
private String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public User() {
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
我的 persistence.xml 文件 src/main/java/META-INF/ 看起来像:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name="myPu" transaction-type="JTA">
<jta-data-source>jdbc/PlanYourTime</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/load-script.sql"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>
</persistence-unit>
并且在我的 glassfish 服务器管理页面中我还添加了
Jdbc 资源和 jdbc 连接池如下:
我的 war 工件结构在我部署的 IntellijIdea 中看起来像
到 glassfish 5.0 服务器:
当我检查 server.log glassfish 时,我没有收到任何错误。
我将非常感谢您的帮助。
你是created/used实体管理员吗?如果不是,则持久性模块没有启动。使用实体管理器进行插入,或尝试:
Use eclipselink.deploy-on-startup
to configure deployment on startup
(at the creation of the EntityManagerFactory) instead of occurring the
first time an EntityManager is created.
Glassfish 劫持了 EclipseLink DDL 生成功能,迫使其编写脚本,更直接地控制模式生成过程。这适用于大多数情况,但当您想使用不适合脚本生成的 EclipseLink "create-or-extend-tables" 时就不行了。
见
我通过在 EntityManager 中添加 java class 解决了我的问题。现在,表格会自动从我的 java @Entity 模型创建到我的数据库中。
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class Test{
@PersistenceContext
private EntityManager em;
}
你好,我在启用从 java 模型 @Entity classes 自动生成数据库表时遇到了问题。我几乎什么都试过了。
我首先在 Intellij Idea 中创建了 maven 项目我已经下载了我正在使用的 JavaEE 8 api 实现。
我正在使用 Glassfish 5.0 服务器作为 java ee 8 实现提供程序和 MySQL 数据库。
我的项目结构:
我的 pom.xml 看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zerg.web</groupId>
<artifactId>PlanYourTime</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
我的模型@Entity class 我想在我的 MySQL 数据库中生成表。
package model;
import javax.persistence.*;
@Entity
@TableGenerator(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USERID")
private int userId;
@Column(name = "USERNAME")
private String username;
@Column(name = "PASSWORD")
private String password;
@Column(name = "EMAIL")
private String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public User() {
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
我的 persistence.xml 文件 src/main/java/META-INF/ 看起来像:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name="myPu" transaction-type="JTA">
<jta-data-source>jdbc/PlanYourTime</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="javax.persistence.schema-generation.create-source" value="metadata"/>
<property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/load-script.sql"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
</properties>
</persistence-unit>
并且在我的 glassfish 服务器管理页面中我还添加了 Jdbc 资源和 jdbc 连接池如下:
我的 war 工件结构在我部署的 IntellijIdea 中看起来像 到 glassfish 5.0 服务器:
当我检查 server.log glassfish 时,我没有收到任何错误。
我将非常感谢您的帮助。
你是created/used实体管理员吗?如果不是,则持久性模块没有启动。使用实体管理器进行插入,或尝试:
Use
eclipselink.deploy-on-startup
to configure deployment on startup (at the creation of the EntityManagerFactory) instead of occurring the first time an EntityManager is created.
Glassfish 劫持了 EclipseLink DDL 生成功能,迫使其编写脚本,更直接地控制模式生成过程。这适用于大多数情况,但当您想使用不适合脚本生成的 EclipseLink "create-or-extend-tables" 时就不行了。
见
我通过在 EntityManager 中添加 java class 解决了我的问题。现在,表格会自动从我的 java @Entity 模型创建到我的数据库中。
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class Test{
@PersistenceContext
private EntityManager em;
}