EclipseLink / MySQL / Glassfish - 即使连接正常,也不会创建表

时间:2017-07-01 13:51:59

标签: java mysql jpa glassfish eclipselink

我正在尝试设置一个基本的JPA应用程序,它在mySQL中创建一个简单的表。

我使用glassfish 4.1,我创建了连接池/资源,并从管理面板成功ping了数据库。

我创建了一个Web应用程序项目,它只包含一个简单实体和src / META-INF文件夹下的persistence.xml。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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_1.xsd">
 <persistence-unit name="DataPersistencePU" transaction-type="JTA">
 <jta-data-source>mysqlresource</jta-data-source>
 <exclude-unlisted-classes>false</exclude-unlisted-classes>
  <properties>
  <property name="javax.persistence.schema-generation.database.action"    value="create"/>
</properties>
</persistence-unit>
</persistence>

实体文件,

 @Entity
public class DataProvider implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof DataProvider)) {
        return false;
    }
    DataProvider other = (DataProvider) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "Entity.DataProvider[ id=" + id + " ]";
}

}

我也试过在/ WEB-INF下移动persistence.xml,但仍无法解决。

Glassfish日志中没有错误。 我只是想让eclipseLink工作并自动生成表格。

1 个答案:

答案 0 :(得分:1)

正如Dark提到的,我创建了EntityManager,启动了一个事务,并在表中保留了一行:

@WebServlet(name = "TestUsertServlet", urlPatterns = {"/TestUsertServlet"})
@PersistenceContext(
    unitName = "DataPersistencePU")
@TransactionAttribute(REQUIRED)
 public class TestUsertServlet extends HttpServlet {

@Resource
private javax.transaction.UserTransaction utx;

@PersistenceContext
EntityManager em;

protected void processRequest(HttpServletRequest request,     HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet TestUsertServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet TestUsertServlet at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try {
        utx.begin();
        TestUser testUser = new TestUser();
        em.persist(testUser);
        utx.commit();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

但是想知道为什么要创建表需要EntityManager。 我认为EM只能与持久化上下文一起使用,持久化上下文是与数据库相关的实体的生命周期,这意味着表示记录到表的对象,而不是表本身,对吗?