【问题标题】:Hibernate does not save Object even not getting any error in logHibernate 不保存对象,即使日志中没有任何错误
【发布时间】:2015-09-22 16:44:34
【问题描述】:

我在 db 中有一个表。创建了一个 pojo 类以将类实例映射到表。我的班级结构是

   @Entity
    @Table(name = "example")
    class example {
     @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID")
        int id;
        @Column(name = "SLOT_ID")
        int slot_id;
        @Column(name = "SLOT_DATE")
        String slot_date;
        @Column(name = "HOTEL_ID")
        String hotel_id;
        @Column(name = "ROOM_TYPE_ID")
        String room_type_id;
        @Column(name = "CREATE_DATE")
        String create_date;
        @Column(name = "UPDATE_DATE")
        String update_date;
        @Column(name = "SLOT_PRICE")
        Double slot_price;
        @Column(name = "AVAILABLE_ROOMS")
        Integer available_roooms;

//rest have getter and setter method }

Hibernet 提交部分

  public void save(Example example) {

        Session session = null;
        try {
            log.info( example.toString());
            session = this.sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            session.persist(example);
            tx.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

登录我正在获取此日志

Hibernate: insert into example(AVAILABLE_ROOMS, CREATE_DATE, HOTEL_ID, ROOM_TYPE_ID, SLOT_DATE, SLOT_ID, SLOT_PRICE, UPDATE_DATE) values (?, ?, ?, ?, ?, ?, ?, ?)

我可以从同一张表中获取数据,这里是 Code snap `

session = this.sessionFactory.openSession(); 
Criteria cr = session.createCriteria(Example.class); cr.add(Restrictions.eq("id", id)); List results = cr.list();
 if(results.size()>0) 
return mapper.writeValueAsString(results.get(0)); //id is auto //incremented in table`

我在日志中没有看到任何错误,但是当我在 DB 中检查时没有插入任何数据。任何线索我错过了什么?

【问题讨论】:

  • 你是如何创建你的会话工厂的?
  • 嗨约翰,我已经将会话工厂定义为一个 bean,然后它通过实现自动装配 @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory;我已经检查过了,我正在获取 sessionFactory 的实例
  • 嗨,约翰,我可以从同一张表中获取数据,这里是 Code snap session = this.sessionFactory.openSession();条件 cr = session.createCriteria(Example.class); cr.add(Restrictions.eq("id", id));列表结果 = cr.list(); if(results.size()>0) return mapper.writeValueAsString(results.get(0)); //id是自动的//在表中递增

标签: java hibernate spring-mvc hibernate-mapping spring-annotations


【解决方案1】:

使用此代码并测试一次

public void save(Example example) {
    Session session = null;
    Transaction tx=null;
    try {
        log.info( example.toString());
        session = this.sessionFactory.openSession();
        tx = session.beginTransaction();
        session.persist(example);
        tx.commit();

    } catch (Exception e) {
        e.printStackTrace();
    } finally {

     if (!tx.wasCommitted()) {
     tx.rollback();
     }//not much doing but a good practice
     session.flush(); //this is where I think things will start working.
     session.close();
    }
}

关闭前调用flush的充分理由是here

【讨论】:

  • 嗨,Viraj,我试过了,但没用。我尝试也尝试另一件事是。创建一个没有任何自动修改字段的新表,然后插入虚拟数据(Hibernate: insert into person (name, id) values (?, ?))。我检查插入正在发生,所以我认为自动递增字段可能是问题。如果你有同样的感觉,那么你能建议我一些解决这个问题的方法吗?
  • 您的解决方案工作。 db 需要时间来反映插入的数据:-)
  • @Nand 是的,它可能需要时间,而且休眠也需要时间来刷新它。很高兴它有效..如果我的解决方案有效,您可以接受这个答案.. :-)
  • @Nand 是的,我们可以!只需在此处提及 stackoverflow 引用,以便提醒我..
【解决方案2】:

我认为你必须使用 session.save() 而不是 session.persist(),或者你必须在 Viraj 指出的事务结束时使用刷新,也可以参考这篇文章

What's the advantage of persist() vs save() in Hibernate?

【讨论】:

  • 嗨,pappu,我正在使用“session.persist”,并且还测试了 viraj 提供的代码,但它不起作用。我认为表中定义的自动递增字段存在问题。你能告诉我一些解决这个问题的方法吗?
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 2017-08-27
  • 2016-07-06
  • 1970-01-01
  • 2011-12-21
  • 2020-06-13
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多