【问题标题】:JPA2:i persist a entity ,there is no exception but the data is not saved in databaseJPA2:我坚持一个实体,没有例外,但数据没有保存在数据库中
【发布时间】:2011-11-05 07:16:59
【问题描述】:

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

实体豆:

 @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;

DAClass(不是会话bean):

 EntityManagerFactory factory=Persistence.createEntityManagerFactory("BookXPU");
    EntityManager em=factory.createEntityManager();

      public long  createBook(Long isbn, Integer dealTotal, Integer saleTotal, Integer salePrice, Integer dealPrice){
       BookBook book=new BookBook();
       book.setDealTotal(dealTotal);
       book.setSalePrice(salePrice);
       book.setDealTotal(dealTotal);
       book.setDealPrice(dealPrice);
       book.setIsbn(isbn);
       List<BookBookdetail> list=new ArrayList<BookBookdetail>();
       book.setBookBookdetailList(null);
       em.persist(book);


       Query query =em.createQuery("SELECT b FROM BookBook b WHERE b.isbn = :isbn");
       query.setParameter("isbn",book);
       List list1=query.getResultList();
           for (Iterator it = list1.iterator(); it.hasNext();) {
               BookBookDetail book1 = (BookBookDetail)it.next();
               list.add(book1);
           }
           book.setBookBookdetailList(list);
       em.merge(book);
       return  book.getIsbn();


       }

谢谢...

【问题讨论】:

  • 我尝试在 sessionbean 中测试此代码并成功...
  • 那么,您确实尝试过并且有效吗?这段代码有问题吗?在数据库中看不到结果还是在代码中使用查询?
  • 如果这个代码在一个普通的java类中......我在数据库中看不到结果......我不得不将公共类更改为无状态会话bean......我可以看到结果然后..但是你能告诉我如何更改代码以便在普通 java 类中取得成功

标签: java jpa ejb


【解决方案1】:

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

如果您在 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多