Spring 启动/休眠 Select 插入前
Spring Boot / Hibernate Select's before insert
当我试图在下面的 table 中插入一行时,Hibernate 会在每次插入之前执行 SELECT
,我想避免这种情况。我认为 Hibernate 在插入之前执行此 SELECT
以查看该对象是否是新的。这就是为什么我实现了 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 (?, ?, ?, ?)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Embeddable
@Getter
@Setter
public class GroupEquipmentPK implements Serializable {
protected Long programGroupId;
protected Long equipmentId;
}
@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;
}
}
是的,这就是 JPA 进行更新的方式。没有更新方法。
如果您不经常执行保存,我建议您让它执行 select 查询。
Hibernate 在 INSERT 之前执行 SELECT 查询以检查此值是否已经存在...我通过调用 EntityManager 对象找到了解决方案并使用 .persist() 方法 insteed .save()这就是我如何避免那些 SELECTS
当我试图在下面的 table 中插入一行时,Hibernate 会在每次插入之前执行 SELECT
,我想避免这种情况。我认为 Hibernate 在插入之前执行此 SELECT
以查看该对象是否是新的。这就是为什么我实现了 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 (?, ?, ?, ?)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Embeddable
@Getter
@Setter
public class GroupEquipmentPK implements Serializable {
protected Long programGroupId;
protected Long equipmentId;
}
@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;
}
}
是的,这就是 JPA 进行更新的方式。没有更新方法。
如果您不经常执行保存,我建议您让它执行 select 查询。
Hibernate 在 INSERT 之前执行 SELECT 查询以检查此值是否已经存在...我通过调用 EntityManager 对象找到了解决方案并使用 .persist() 方法 insteed .save()这就是我如何避免那些 SELECTS