我尝试使用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,结果相同。
答案 0 :(得分:0)
我认为你应该打电话给.flush(),以便他们得到保存。尝试我认为它会起作用。也用
@Transactional
public long saveBook(Book book) {
entityManager.persist(book);
entityManager.flush();
return book.getId();
}
答案 1 :(得分:0)
借助您的课程,我完成了相同的项目。但是,我使用了HibernatePersistenceProvider和WildFly服务器。我遇到以下问题,并找到了一些解决方案。也许有什么可以帮助您。
当我添加休眠核心依赖项时,我没有使用scope = provided,但我应该使用。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
<scope>provided</scope>
</dependency>
persistence.xml的位置是WEB-INF-> classes-> META-INF。我的应用失败了,但我没有纠正它。
这是我在GitHub上的项目的a link。