Hibernate session.flush()即使设置了自动提交

时间:2016-10-28 13:34:23

标签: java sql-server hibernate session

我意识到需要为主键不是GeneratedValue的实体调用session.flush(),然后才能将它们保存在数据库中。即使我已经将autocommit设置为true,我也必须这样做。 这是我的hibernate配置

<property name="hibernate.dialect">${hibernate.dialect}</property>
<property name="hibernate.connection.driver_class">${hibernate.connection.driver_class}</property>
<property name="hibernate.connection.url">${hibernate.connection.url}</property>
<property name="hibernate.connection.username">${hibernate.connection.username}</property>
<property name="hibernate.connection.password">${hibernate.connection.password}</property>
<property name="connection.autocommit">true</property>

以下是我需要在保存之前保存之后在代码中调用session.flush()的实体的示例

    @Id
    @Column(name = "MembTypeCode")
    private String memTypeCode;
    @Column(name = "MemberType")
    private String memberType;
  ...

但是对于Id为GeneratedValue的实体(如下所示),我不需要在保存之后在代码中调用session.flush(),因为我将autocommit设置为true

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PrescriptId")
private int prescriptId;
@Column(name = "InvNum")
private Integer invNum;
@Column(name = "DocType")
private String docType;
...

有人可以向我解释为什么我会遇到这种情况吗?我使用的是Hibernate 4.1.0.FINAL

1 个答案:

答案 0 :(得分:1)

Autocommit和session.flush()是两回事:

  1. Autocommit在基础JDBC事务上设置自动提交模式。它基本上意味着每个SQL语句(SELECT,UPDATE,INSERT,DELETE,...)都在自己的事务中执行。
  2. session.flush()告诉Hibernate将内存状态与数据库同步,以便将SQL语句写入JDBC连接。点击此处:What's the use of session.flush() in Hibernate
  3. 因此,虽然我不知道为什么示例中的实体仅在一种情况下持久保存到数据库,但它可能与自动提交模式无关。