【发布时间】:2017-04-20 17:18:47
【问题描述】:
我正在尝试使用 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="RESOURCE_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,结果相同。
【问题讨论】:
-
这似乎是事务的问题,如下所示。您可以尝试添加
@TransactionAttribute(TransactionAttributeType.REQUIRED)而不是@Transactional,因为后者AFAIK(我对EJB 不太熟悉)用于CDI bean。见:stackoverflow.com/questions/17838221/… -
我尝试添加 @Transactional 和 @TransactionAttribute(TransactionAttributeType.REQUIRED) 没有改变。
-
嗨,你有没有找到解决这个问题的方法?