为什么hibernate在调用get时调用update?

dtcbnfnu  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(383)

我有两个实体,
父实体

Entity
@Table(name = "parent")
@Data
@NoArgsConstructor
public class Parent {

  @Column(name = "uuid")
  private UUID uuid;

  @Column(name = "type")
  private String type;

  @Column(name = "gateway")
  private String gateway;

  @OneToMany(fetch = FetchType.EAGER,orphanRemoval = true)
  @JoinColumn(name = "example")
  @OnDelete(action = OnDeleteAction.CASCADE)
  private List<Child> childs;

...
other paramerters

}

还有我的孩子

@Entity
@Table(name = "child")
@Data
@NoArgsConstructor
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private Long id;

    @Column(name = "unit")
    private String unit;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "example")
    private Parent parent;

...
other paramerters
}

所以当我调用get方法时 @Transactional 它总是执行更新操作??为什么?我该怎么防止呢?
get方法

public class PublicImp implements CRUD {

    @Transactional(isolation = Isolation.READ_COMMITTED)
    @Override
    public Parent getParent(UUID uuid) {
List<Parent> parents = repository.findByUUID(uuid);
return parents.get(0);

    }
}

这是日志上的

update
        child 
    set
        unit=? 
    where
        id=?
Hibernate: 
    update
        child 
    set
        unit=? 
    where
        id=?

2020-11-26 | 20:16:16.592 | http-nio-9797-exec-1 | TRACE | o.h.t.d.sql.BasicBinder | binding parameter [1] as [VARCHAR] - [kWh]
2020-11-26 | 20:16:16.592 | http-nio-9797-exec-1 | TRACE | o.h.t.d.sql.BasicBinder | binding parameter [2] as [BIGINT] - [2493]

编辑:我的存储库

public interface DeviceInfoRepository extends JpaRepository<Parent,String> {
  List<Parent> findByUUID(UUID uuid);

}
v9tzhpje

v9tzhpje1#

通常,当作为持久性上下文一部分的实体被认为是脏的并且您使用的查询触及这些脏实体的表时,就会发生这种情况。为了让这些查询返回正确的结果,hibernate必须首先将dirty状态刷新到数据库中。

lrpiutwd

lrpiutwd2#

我修好了,问题是我用的是 UserType i、 e是用于json存储和检索的postgres数据类型的用户实现,问题是 equals(Object x , Object y) 是在给予 false 如@christian所述
通常,当作为持久性上下文一部分的实体被认为是脏的并且您使用的查询触及这些脏实体的表时,就会发生这种情况。
因此jpa认为它是肮脏的,因为equals总是返回false,在修复equals函数之后,代码运行良好

相关问题