我有两个实体,
父实体
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);
}
2条答案
按热度按时间v9tzhpje1#
通常,当作为持久性上下文一部分的实体被认为是脏的并且您使用的查询触及这些脏实体的表时,就会发生这种情况。为了让这些查询返回正确的结果,hibernate必须首先将dirty状态刷新到数据库中。
lrpiutwd2#
我修好了,问题是我用的是
UserType
i、 e是用于json存储和检索的postgres数据类型的用户实现,问题是equals(Object x , Object y)
是在给予false
如@christian所述通常,当作为持久性上下文一部分的实体被认为是脏的并且您使用的查询触及这些脏实体的表时,就会发生这种情况。
因此jpa认为它是肮脏的,因为equals总是返回false,在修复equals函数之后,代码运行良好