Hibernate 不返回手动插入的行

Posted

技术标签:

【中文标题】Hibernate 不返回手动插入的行【英文标题】:Hibernate doesn't return manually INSERTed rows 【发布时间】:2019-02-22 16:25:09 【问题描述】:

我的 jpa 存储库出现问题,无法返回我通过良好的旧 SQL 手动插入数据库 (Oracle) 的行

Insert into SYSTEM.USER (ID,CREDENTIALS,ISADMIN) values (USERSEQ.nextval,'foo',1);

我的 Jpa 存储库

@RepositoryRestResource
public interface UserRepository extends JpaRepository<User, Long> 

用户实体

@Data
@Entity
public class User 
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen")
  @SequenceGenerator(initialValue = 1, allocationSize = 1, name = "idgen", sequenceName = "userseq")
  private Long id;

  @NotNull
  private String credentials;

  private boolean isAdmin;

超级奇怪的是,我通过 REST 接口插入的条目有效!

所以如果我创建:

用户 A 通过 REST API 用户 B 通过 SQL 语句 用户 C 通过 REST API

GET /api/users 的结果是A, C

拔掉我所有的头发后。我想我已经把它缩小到了 Oracle 的闪回特性。因为只有 A 和 C 在闪回中有条目。因此,Hibernate 必须在幕后施展魔法。

所以我的问题是。如何使用 SQL 插入一行,以便它也获得闪回条目。

如果闪回不是问题。那么如何让 Hibernate 返回所有行呢?

【问题讨论】:

commit你的insert了吗? 嗯不知道oracle中有commit关键字:) @MarmiteBomber COMMIT WORK; 工作!谢谢! 乐于助人;) 是的,如果您使用 INSERT 语句,则没有 autocommit=TRUE 【参考方案1】:

当您在 Oracle Sql Developer 中执行 SQL 查询时,它正在运行自己的会话。 JPA 正在自己的会话中工作。即 JPA 无法访问 SQL 查询的记录。

解决方案

Insert into SYSTEM.USER (ID,CREDENTIALS,ISADMIN) values (USERSEQ.nextval,'foo',1);

之后,只需在 Oracle Sql Developer 中触发 COMMIT 命令。

它对我有用。

【讨论】:

以上是关于Hibernate 不返回手动插入的行的主要内容,如果未能解决你的问题,请参考以下文章

批量更新从更新返回了意外的行数(Spring/Hibernate)

org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1

org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1

计算 Hibernate JPA 中子查询返回的行数

HIbernate“StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1”

org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期的