java - 如何使用 Entity Manager 和 GenericDao Bean 和 Tomee 来持久化对象

标签 java mysql jpa ejb apache-tomee

我刚开始接触 Java EJB。 :) 我在 eclipse 中有动态 web 项目,我想将对象保存到 mysql 数据库。不明白为什么它不起作用,因为我的控制台中没有异常。 我正在使用我在 eclipse 中安装的 Apache Tomee 服务器。

我的实体类:

package entities;
import static javax.persistence.GenerationType.IDENTITY;
import java.io.Serializable;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name="books")
public class Book implements Serializable{

private static final long serialVersionUID = -9009670426767476684L;

@Id 
@GeneratedValue   
private int id;

@Column(name="name")
private String name;

public Book(){        
}

public Book(String name) {
    super();
    this.name = name;
}


public int getId() {
  return id;
}

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

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}    
}

GenericDaoBean:

package beans;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

public abstract class GenericDaoBean<T, ID extends Serializable> implements GenericDaoLocal<T, ID> {

private Class<T> entityType;

@PersistenceContext(unitName = "facebook")
protected EntityManager em;

@SuppressWarnings("unchecked")
public GenericDaoBean() {
    entityType = (Class<T>) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
}

public Class<T> getEntityType() {
    return entityType;
}

public T findById(ID id) {
    T entity;
    entity = em.find(entityType, id);
    return entity;
}

@SuppressWarnings("unchecked")
public List<T> findAll() {
    Query q = em.createQuery("SELECT x FROM " + entityType.getSimpleName()
            + " x");
    List<T> result = q.getResultList();
    return result;
}

@SuppressWarnings("unchecked")
public List<T> findBy(String query) {
    Query q = em.createQuery(query);
    List<T> result = q.getResultList();
    return result;
}

public T persist(T entity) {
    em.persist(entity);
    return entity;
}

public T merge(T entity) {
    entity = em.merge(entity);
    return entity;
}

public void remove(T entity) {
    entity = em.merge(entity);
    em.remove(entity);
}

public void flush() {
    em.flush();
}

public void clear() {
    em.clear();
}

}

GenericDaoBeanLocal:

package beans;

import java.io.Serializable;
import java.util.List;

public interface GenericDaoLocal<T, ID extends Serializable> {

public Class<T> getEntityType();

public T findById(ID id);

public List<T> findAll();

public List<T> findBy(String query);

public T persist(T entity);

public T merge(T entity);

public void remove(T entity);

public void flush();

public void clear();

}

Controller :

package controllers;

import java.io.IOException;
import java.util.Calendar;
import javax.ejb.EJB;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import beans.BookDaoLocal;
import entities.Book;

public class RegistrationController extends HttpServlet {
private static final long serialVersionUID = 381026218072249234L;

@EJB
private BookDaoLocal bookDao;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    String name = req.getParameter("name");
    Book b = new Book();
    b.setName(name);
    bookDao.persist(b);

}
}

在 META_INF 文件夹下的 WebContent 中,我有 persistance.xml 和文件:

持久性.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">


<persistence-unit name="facebook" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>facebook</jta-data-source>
<class>entities.Book</class>

<properties>
        <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>

        <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
        <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)" />

        <property name="openjpa.jdbc.EagerFetchMode" value="join"/>
        <!--<property name ="openjpa.RuntimeUnenhancedClasses" value="unsupported" />-->
</properties>      

在我的 src 中有 jndi.properties 文件:

 java.naming.factory.initial=org.apache.openejb.client.RemoteInitialContextFactory
java.naming.provider.url=http://127.0.0.1:8080/tomee/ejb

在我的控制台中我有:

INFO: Server startup in 4161 ms
10092  facebook  INFO   [http-bio-8080-exec-7] openjpa.Runtime - Starting OpenJPA 2.4.0-nonfinal-1598334
11626  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 2120544240> executing prepstmnt 598104600 SELECT   SEQUENCE_SCHEMA, SEQUENCE_NAME FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES
11626  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 2120544240> [0 ms] spent
11645  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 2120544240> executing prepstmnt 726242714 SELECT SEQUENCE_SCHEMA, SEQUENCE_NAME FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES
11646  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 2120544240> [1 ms] spent
11794  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 811560660> executing prepstmnt 1999826151 SELECT SEQUENCE_VALUE FROM PUBLIC.OPENJPA_SEQUENCE_TABLE WHERE ID = ? [params=?]
11794  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 811560660> [0 ms] spent
11795  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 811560660> executing prepstmnt 344473922 UPDATE PUBLIC.OPENJPA_SEQUENCE_TABLE SET SEQUENCE_VALUE = ? WHERE ID = ? AND SEQUENCE_VALUE = ? [params=?, ?, ?]
11797  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 811560660> [2 ms] spent
11813  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 1798001212> executing prepstmnt 1563539472 INSERT INTO PUBLIC.books (ID, NAME) VALUES (?, ?) [params=?, ?]
11814  facebook  TRACE  [http-bio-8080-exec-7] openjpa.jdbc.SQL - <t 1249135181, conn 1798001212> [1 ms] spent

在 tomee.xml(tomee 的数据源)中:

<Resource id="facebook" type="DataSource">
  JdbcDriver com.mysql.jdbc.Driver
  JdbcUrl jdbc:mysql://127.0.0.1:3306/facebook?autoReconnect=true
  UserName root
  Password root
  JtaManaged true
</Resource> 

我应该添加或删除什么才能使 Controller 中的代码正常工作? (在我的数据库中保留对象)

2)第二种情况是: 由于数据库中没有任何内容持久存在,因此当我尝试从我试图持久存在的同一个表中查询记录时,这对我来说很奇怪,结果我得到了我试图保存在表中的所有名称的列表。 (我试图保存在 dbase 中的所有名称,现在都在我的 jsp 中列出了不在 dbase 中的名称) 我的 test.jsp 是:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<sql:query var="rs" dataSource="jdbc/facebook">
    select name from books
</sql:query>

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>

  <h2>Results</h2>

 <c:forEach var="row" items="${rs.rows}">
    Name ${row.name}<br/>
 </c:forEach>

   </body>
</html> 

这意味着数据源包含这些数据?为什么会这样?如何让我的数据保存到数据库?任何帮助... 我是新手,所有的帮助都是宝贵的:)

最佳答案

打开服务器的 server.xml 文件并将以下内容添加到 GlobalNamingResources 部分:

 <Resource name="facebook"
 auth="Container" 
 type="javax.sql.DataSource"
 driverClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/facebook" 
 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
 username="root"
 password=""
 maxActive="100"
 maxIdle="20"
 minIdle="5"
 maxWait="10000"
/>

然后从您的应用程序 context.xml 文件中删除资源定义并将以下 xml 添加到 context.xml

<ResourceLink
        name="jdbc/facebook"
        global="facebook"
        type="javax.sql.DataSource"
        factory="org.apache.naming.factory.DataSourceLinkFactory"/>

然后打开您的 persistence.xml 文件并更新

<jta-data-source>jdbc/facebook</jta-data-source>

重启服务器。

关于java - 如何使用 Entity Manager 和 GenericDao Bean 和 Tomee 来持久化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31388849/

相关文章:

Java正则表达式匹配堆栈溢出

PHP & MYSQL 从数据库中拉取行,将每个单元格设置为变量

MySQL 查询,MAX() + GROUP BY + WHERE

java - 如何在 Java 中为 ScrollPane 和 TextPane 提供 TabPane

java 覆盖不起作用

java - java中套接字编程中的Connection Refused错误

php - 如何获取记录求和到一个值然后添加到两个新表中?

java - 如何设置属性排序,当我使用Jpa时Example.of

java - 选择查询中的 OptimisticLockException

java - 如何使用 LEFT OUTER JOIN 创建 JPA 查询