JPA EntityManager持久化方法不会将实体保存到db,但实体在持久化后具有id

时间:2017-04-20 17:18:48

标签: java jpa servlets ejb jta

我尝试使用jpa将实体保存到数据库。这是我的实体:

import javax.persistence.*;

@Entity
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    public Book() {
    }
    public Book(String title) {
        this.title = title;
    }
    public Long getId() {
        return id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

这里是persistence.xml:

<persistence-unit name="bookUnit">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>ee.jpa.Book</class>
    <properties>
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Lessons"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="1"/>
    </properties>
</persistence-unit>

这是我的EJB:

@Stateless
public class JpaBean {
    @PersistenceContext
    EntityManager entityManager;
    public long saveBook(Book book) {
        entityManager.persist(book);
        return book.getId();
    }
}

这是我的servlet:

@WebServlet("/jpaExample")
public class ServletExample extends HttpServlet {
    @EJB
    JpaBean jpaBean;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Book book = new Book("servlet");
        long l = jpaBean.saveBook(book);
        resp.getWriter().write(l + " ");
    }
}

我已将EclipseLink.jar添加到我的项目和TomcatEEDir / lib /目录中。一切都编译并运行,没有例外。每次运行servlet时都会得到不同的数字,比如1 2 3 ......等等。但是当我看到db时,那里什么都没有。没有表,没有数据。我做错了什么?怎么解决?我也尝试使用java SE,为此我添加了transaction-type =&#34; RESOURCE_LOCAL&#34;持久性单位并编写了这样的代码:

public class MainExample {
public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("bookUnit");
    EntityManager em = emf.createEntityManager();
    Book book = new Book("main");
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    em.persist(book);
    tx.commit();
    em.close();
    emf.close();
}
}

此代码完美运行并将数据保存到DB。那么,我之前的代码出了什么问题。为什么没有保存到DB?

编辑:如果使用Hibernate,结果相同。

2 个答案:

答案 0 :(得分:0)

我认为你应该打电话给.flush(),以便他们得到保存。尝试我认为它会起作用。也用

@Transactional
public long saveBook(Book book) {
    entityManager.persist(book);
    entityManager.flush();
    return book.getId();
}

答案 1 :(得分:0)

借助您的课程,我完成了相同的项目。但是,我使用了HibernatePersistenceProvider和WildFly服务器。我遇到以下问题,并找到了一些解决方案。也许有什么可以帮助您。

  1. 当我添加休眠核心依赖项时,我没有使用scope = provided,但我应该使用。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.17.Final</version>
        <scope>provided</scope>
    </dependency>
    
  2. persistence.xml的位置是WEB-INF-> classes-> META-INF。我的应用失败了,但我没有纠正它。

这是我在GitHub上的项目的a link