hibernate只有查询操作,实际却执行了更新语句

最近在项目中发现在事务中只执行了查询操作,开启sql debug打印却发现有更新语句。经过排查发现是实体中包含的值对象没有覆盖equals和hashcode操作,怀疑hibernate在用默认的equals进行比较的时候发现对象不等,所以执行了删除操作,然后再执行插入操作。

实体对象:

@Getter
@Setter
@ToString
@Entity
public class Person extends AbstractPersistable {
    @Column
    private String name;
    @ElementCollection(targetClass = Phone.class)
    @CollectionTable
    private Set<Phone> phones;
}

值对象:

@Getter
@Setter
@ToString
@Embeddable
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "number")
public class Phone implements Serializable {
    @Column
    private String number;
}

注意要覆盖equals和hashcode。否则debug日志如下:

Hibernate: select person0_.id as id1_19_, person0_.version as version2_19_, person0_.name as name3_19_ from person person0_ where person0_.name=?
Hibernate: select phones0_.person_id as person_i1_20_0_, phones0_.number as number2_20_0_ from person_phones phones0_ where phones0_.person_id=?
Person(name=333, phones=[Phone(number=34567), Phone(number=3456)])
Hibernate: update person set version=?, name=? where id=? and version=?
Hibernate: delete from person_phones where person_id=?
Hibernate: insert into person_phones (person_id, number) values (?, ?)
Hibernate: insert into person_phones (person_id, number) values (?, ?)

附spring boot开启hibernate sql打印和参数打印方法:

resources下加入logback-spring.xml,其中的内容如下:

<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
    <logger name="org.hibernate.SQL" level="DEBUG"/>
</configuration>

 

发布了6 篇原创文章 · 获赞 1 · 访问量 8542

猜你喜欢

转载自blog.csdn.net/guangmingguangming/article/details/104885791