Java JPA2:我保存了一个实体,没有例外,但数据没有保存在数据库中

Java JPA2:我保存了一个实体,没有例外,但数据没有保存在数据库中,java,jpa,ejb,Java,Jpa,Ejb,我正在使用EJB在netbeans上编写CRUD演示代码。当我编写一个可以将数据保存到数据库中的代码时,没有错误和异常,但数据没有保存在数据库中 代码: entitybean: @Entity @Table(name = "book_book") @XmlRootElement @NamedQueries({ @NamedQuery(name = "BookBook.findAll", query = "SELECT b FROM BookBook b"

我正在使用EJB在netbeans上编写CRUD演示代码。当我编写一个可以将数据保存到数据库中的代码时,没有错误和异常,但数据没有保存在数据库中 代码:

entitybean:

 @Entity
    @Table(name = "book_book")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "BookBook.findAll", query = "SELECT b FROM BookBook b"),
        @NamedQuery(name = "BookBook.findByIsbn", query = "SELECT b FROM BookBook b WHERE b.isbn = :isbn"),
        @NamedQuery(name = "BookBook.findByDealTotal", query = "SELECT b FROM BookBook b WHERE b.dealTotal = :dealTotal"),
        @NamedQuery(name = "BookBook.findBySaleTotal", query = "SELECT b FROM BookBook b WHERE b.saleTotal = :saleTotal"),
        @NamedQuery(name = "BookBook.findBySalePrice", query = "SELECT b FROM BookBook b WHERE b.salePrice = :salePrice"),
        @NamedQuery(name = "BookBook.findByDealPrice", query = "SELECT b FROM BookBook b WHERE b.dealPrice = :dealPrice")})
    public class BookBook implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
    //    @NotNull
        @Column(name = "isbn")
        private Long isbn;
        @Column(name = "deal_total")
        private Integer dealTotal;
        @Column(name = "sale_total")
        private Integer saleTotal;
        @Column(name = "sale_price")
        private Integer salePrice;
        @Column(name = "deal_price")
        private Integer dealPrice;
        @OneToMany(mappedBy = "isbn")
        private List<BookBookdetail> bookBookdetailList;
@实体
@表(name=“book\u book”)
@XmlRootElement
@命名查询({
@NamedQuery(name=“BookBook.findAll”,query=“从账簿b中选择b”),
@NamedQuery(name=“BookBook.findByIsbn”,query=“从BookBook b中选择b,其中b.isbn=:isbn”),
@NamedQuery(name=“BookBook.findByDealTotal”,query=“从账簿b中选择b,其中b.dealTotal=:dealTotal”),
@NamedQuery(name=“BookBook.findBySaleTotal”,query=“从BookBook b中选择b,其中b.saleTotal=:saleTotal”),
@NamedQuery(name=“BookBook.findBySalePrice”,query=“从账簿b中选择b,其中b.salePrice=:salePrice”),
@NamedQuery(name=“BookBook.findbydalprice”,query=“从BookBook b中选择b,其中b.dealPrice=:dealPrice”)}
公共类BookBook实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
//@NotNull
@列(name=“isbn”)
私人长期isbn;
@列(name=“交易总额”)
私有整数dealTotal;
@列(name=“销售总额”)
私人整数销售总额;
@列(名称=“销售价格”)
私人整数销售价格;
@列(name=“交易价格”)
私人整数交易价格;
@OneToMany(mappedBy=“isbn”)
私人列表图书明细表;
DAClass(不是sessionbean):

EntityManagerFactory工厂=Persistence.createEntityManagerFactory(“BookXPU”);
EntityManager em=factory.createEntityManager();
公共长createBook(长isbn、整数dealTotal、整数saleTotal、整数salePrice、整数dealPrice){
BookBook=新的BookBook();
book.setDealTotal(dealTotal);
账面固定价格(销售价格);
book.setDealTotal(dealTotal);
book.setDealPrice(交易价格);
图书编号setIsbn(isbn);
列表=新的ArrayList();
book.setBookBookdetailList(空);
em.persist(书);
Query Query=em.createQuery(“从BookBook b中选择b,其中b.isbn=:isbn”);
setParameter(“isbn”,图书);
List list1=query.getResultList();
for(Iterator it=list1.Iterator();it.hasNext();){
bookDetail book1=(BookBookDetail)it.next();
列表。添加(第1册);
}
书名:setbookbookdetailist(列表);
em.merge(book);
returnbook.getIsbn();
}

谢谢…

您的实体没有被持久化,因为您没有将实体刷新到数据库中

如果您在Java SE中使用代码,那么您应该:

EntityTransaction tx = em.getTransaction();
tx.begin();
// persist, merge, etc. - operations which needs to be in the Tx...
tx.close();
如果没有它,您就不会给出一个迹象,表明您所更改的数据应该被刷新到基础数据库中

当您将代码移动到EJB中时,您使用的是JTA事务(隐式)。因此,EntityManager的事务是JTA事务的一部分。默认情况下,EJB的每个方法都是单个JTA事务

现在,结合这些信息,通过将类标记为EJB,您已经将数据刷新到底层数据库


HTH.

我尝试在sessionbean中测试此代码并获得成功…那么,您确实尝试过了,并且成功了?此代码有任何问题吗?您无法在数据库中看到结果或在代码中使用查询?如果此代码在公共java类中..我无法在数据库中看到结果…我必须将公共类更改为无状态sessionbean…并且我可以看到结果了。但是你能告诉我如何修改代码才能在普通java类中获得成功吗
EntityTransaction tx = em.getTransaction();
tx.begin();
// persist, merge, etc. - operations which needs to be in the Tx...
tx.close();