Java JPA EntityManager持久化方法不';t将实体保存到数据库,但实体在持久化后具有id

Java JPA EntityManager持久化方法不';t将实体保存到数据库,但实体在持久化后具有id,java,jpa,servlets,ejb,jta,Java,Jpa,Servlets,Ejb,Jta,我正在尝试使用jpa将实体保存到DB。这是我的实体: import javax.persistence.*; @Entity public class Book { @Id @GeneratedValue private Long id; private String title; public Book() { } public Book(String title) { this.title = title; }

我正在尝试使用jpa将实体保存到DB。这是我的实体:

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>
这是我的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添加到我的项目和TomcateDir/lib/目录中。一切都编译并运行,没有例外。每次运行servlet时,我都会得到不同的数字,比如1、2、3。。。。等等,但当我看db时,什么都没有。没有表格,没有数据。我做错了什么?如何修复它?我还尝试使用JavaSE,为此我向持久化单元添加了transaction type=“RESOURCE\u LOCAL”。并编写了如下代码:

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


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

我认为您应该调用.flush(),以便保存它们。试试看,我想它会管用的。也使用

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

在你的课的帮助下,我做了同样的项目。但是,我使用了HibernatePersistenceProvider和WildFly服务器。我遇到了以下问题并找到了一些解决方案。也许有什么能帮你

  • 当我添加hibernate核心依赖项时,我没有使用scope=provided,但我应该使用

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.17.Final</version>
        <scope>provided</scope>
    </dependency>
    
    
    org.hibernate
    
    我在GitHub上的项目

    我试图编写entityManager.flush();但这没用。据我所知,JTA应该在启动EJB方法之前创建事务,并在启动EJB方法之后提交事务,因此所有更改都应该提交给DB,而不需要额外的代码。顺便说一句,您的代码告诉我,您拥有的这个数字—保存的书籍的id与持久化完全无关。即使您没有enetitymanager.Persistry,也会返回它。无论如何,请尝试在您的方法上使用@Transactional,我希望您在数据库中创建了表,对吗?我尝试过@Transaction,没有帮助,因为我知道没有此注释的EJB是事务性的,我可以使用它来实现事务性的,例如servlet,而不是EJB,因为默认情况下它是事务性的。是的,我已经在db中创建了表。当我运行SE main方法时,它创建了一行,数据id=1,title=main。但当我运行EE示例时,它不会向DB添加数据。顺便说一句,当我运行main方法时,它也会在数据库中创建序列表。这似乎是事务的问题,如下所示。您是否可以尝试添加
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    而不是
    @Transactional
    ,因为后者是用于CDIBeans的AFAIK(我对EJB不太熟悉)。请参阅:我尝试添加@Transactional和@TransactionaAttribute(TransactionAttributeType.REQUIRED),但未更改任何内容。您好,您找到解决此问题的方法了吗?
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.17.Final</version>
        <scope>provided</scope>
    </dependency>