Java JPA EntityManager持久化方法不';t将实体保存到数据库,但实体在持久化后具有id
我正在尝试使用jpa将实体保存到DB。这是我的实体: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; }
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服务器。我遇到了以下问题并找到了一些解决方案。也许有什么能帮你
<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>