Spring Boot / Hibernate 在插入之前选择

Ugl*_*hyn 5 java spring hibernate spring-data-jpa spring-boot

当我尝试在下表中插入一行时,Hibernate 在SELECT每次插入之前都会执行 a 操作,我想避免这种情况。我认为 HibernateSELECT在插入之前执行此操作以查看该对象是否是新的。这就是为什么我实现了Persistable接口并重写了它的方法。该实体具有组合 ID。

select groupreleq0_.equipment_id as equipmen3_22_0_, groupreleq0_.program_group_id as program_4_22_0_, groupreleq0_.description as descript1_22_0_, groupreleq0_.quantity as quantity2_22_0_ from group_m2m_equipment groupreleq0_ where groupreleq0_.equipment_id=? and groupreleq0_.program_group_id=?
select groupreleq0_.equipment_id as equipmen3_22_0_, groupreleq0_.program_group_id as program_4_22_0_, groupreleq0_.description as descript1_22_0_, groupreleq0_.quantity as quantity2_22_0_ from group_m2m_equipment groupreleq0_ where groupreleq0_.equipment_id=? and groupreleq0_.program_group_id=?
select groupreleq0_.equipment_id as equipmen3_22_0_, groupreleq0_.program_group_id as program_4_22_0_, groupreleq0_.description as descript1_22_0_, groupreleq0_.quantity as quantity2_22_0_ from group_m2m_equipment groupreleq0_ where groupreleq0_.equipment_id=? and groupreleq0_.program_group_id=?
select groupreleq0_.equipment_id as equipmen3_22_0_, groupreleq0_.program_group_id as program_4_22_0_, groupreleq0_.description as descript1_22_0_, groupreleq0_.quantity as quantity2_22_0_ from group_m2m_equipment groupreleq0_ where groupreleq0_.equipment_id=? and groupreleq0_.program_group_id=?
insert into group_m2m_equipment (description, quantity, equipment_id, program_group_id) values (?, ?, ?, ?)
insert into group_m2m_equipment (description, quantity, equipment_id, program_group_id) values (?, ?, ?, ?)
insert into group_m2m_equipment (description, quantity, equipment_id, program_group_id) values (?, ?, ?, ?)
insert into group_m2m_equipment (description, quantity, equipment_id, program_group_id) values (?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Embeddable
@Getter
@Setter
public class GroupEquipmentPK implements Serializable {

    protected Long programGroupId;
    protected Long equipmentId;

}
Run Code Online (Sandbox Code Playgroud)
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Table(name = "group_m2m_equipment")
public class GroupRelEquipment implements Serializable, Persistable<GroupEquipmentPK> {

    @EmbeddedId
    private GroupEquipmentPK groupEquipmentPK = new GroupEquipmentPK();

    @ManyToOne(cascade = {CascadeType.PERSIST})
    @JsonIgnore
    @MapsId("equipmentId")
    private Equipment equipment;

    @ManyToOne(cascade = {CascadeType.PERSIST})
    @JsonIgnore
    @MapsId("programGroupId")
    private ProgramGroup programGroup;

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

    @Column(name = "quantity ")
    private Integer quantity;

    @Transient
    private boolean isNew = true;

    public GroupRelEquipment(GroupEquipmentPK groupEquipmentPK, Equipment equipment, ProgramGroup programGroup, String description, Integer quantity) {
        this.groupEquipmentPK = groupEquipmentPK;
        this.equipment = equipment;
        this.programGroup = programGroup;
        this.description = description;
        this.quantity = quantity;
    }


    @Override
    public GroupEquipmentPK getId() {
        return this.groupEquipmentPK;
    }

    @Override
    public boolean isNew() {
        return isNew;
    }

    @PrePersist
    @PostLoad
    void markNotNew() {
        this.isNew = false;
    }
}


Run Code Online (Sandbox Code Playgroud)

Ugl*_*hyn 3

Hibernate 在 INSERT 之前执行 SELECT 查询以检查该值是否已存在...我通过调用 EntityManager 对象并使用 .persist() 方法而不是 .save() 找到了解决方案,这就是我避免这些 SELECTS 的方法