session.save()反映没有事务提交

时间:2017-12-29 12:42:44

标签: java hibernate transactions

获得了一些代码:

<div>
  <div class="col-md-2"  v-for="(post, img) in posts">
    <div class="article-image">
      <img :src="post.img" />
    </div>
  </div>

  <div class="col-md-6" v-for="(post, title) in posts" v-bind="post.id">
    <div class="article">
      <div class="card">
        <div class="card-body">
          <h3 class="card-title">{{ post.title }}</h3>
          <h6 class="card-subtitle text-muted">21st Dec 17</h6>
          <p class="card-text">{{ post.content }}</p>
        </div>
      </div>
    </div>
  </div>
</div>

调试时,我发现在事务提交之前,这个人会反映在数据库中。 我明确地设置了

Session session = sessionFactory.openSession();
    Transaction tx = session.getTransaction();

    try
    {
        tx.begin();

        Person person = Person.builder().name("JAN").surname("NOWAK").age(30).build();
        session.save(person);

        tx.commit();
    }

尝试了各种hibernate版本,但仍然遇到了问题。

即使我在提交之前抛出异常

<property name="hibernate.connection.autocommit">false</property>

结果相同,将人员添加到数据库是否使用 tx.commit()或NOT

修改

将实体生成策略从 IDENTITY 更改为 AUTO 后,它按照我之前的预期工作,在提交后进行DB更改。结果:

try
    {
        tx.begin();

        Person person = Person.builder().name("JAN").surname("NOWAK").age(30).build();
        session.save(person);

        String s = null;
        if (s == null) {
            throw new Exception();
        }

        tx.commit();
    }

但有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

如果您使用save(),那么您不需要使用tx.commit(),因为save()负责在调用时返回标识符。因此,您提交或不将其值存储在db immidiately中。另一方面,如果你想使用commit(),那么去persist()。这将向您详细解释Here