如何在HibernateJava中使用@EmbeddedId执行软删除?
我无法使用@EmbeddedId执行软删除? 未执行@SQLDelete中的sql如何在HibernateJava中使用@EmbeddedId执行软删除?,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我无法使用@EmbeddedId执行软删除? 未执行@SQLDelete中的sql @Data @EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true) @Entity @Audited @Table(name = "service_employee") @SQLDelete(sql = "UPDATE service_employee " + "SET deleted = true " +
@Data
@EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true)
@Entity
@Audited
@Table(name = "service_employee")
@SQLDelete(sql = "UPDATE service_employee " +
"SET deleted = true " +
"WHERE service_employee.service_id = ?1 " +
"AND service_employee.employee_b_number = ?2")
@Where(clause = "deleted = false")
public class ServiceEmployee extends Auditable implements Serializable {
@EmbeddedId
private ServiceEmployeeIdentity serviceEmployeeIdentity;
@Column(name = "critical")
private Boolean critical;
@Column(name = "critical_rationale")
private String criticalRationale;
}
@Repository
public interface ServiceEmployeeRepository extends
JpaRepository<ServiceEmployee, ServiceEmployeeIdentity> {}
// test
ServiceEmployee serviceEmployee = ServiceEmployeeBuilder.aServiceEmployee();
serviceEmployeeService.deleteById(
serviceEmployee.getServiceEmployeeIdentity());
我试图对两个id的值进行硬编码,以构成嵌入的id
我可以在只使用@Id而不使用@Id的实体上实现软删除
@嵌入ID
当我对仅使用@Id的实体运行带有delete的测试时,我可以看到正在控制台上执行的sql,但不使用@EmbeddedId
我认为它只是绕过了@SQLDelete,使用了hibernate中的默认deletesql。
我希望@SQLDelete中的sql正在执行
@Data
@EqualsAndHashCode(exclude = "serviceEmployeeIdentity", callSuper = true)
@Entity
@Audited
@Table(name = "service_employee")
@SQLDelete(sql = "UPDATE service_employee " +
"SET deleted = true " +
"WHERE service_employee.service_id = ?1 " +
"AND service_employee.employee_b_number = ?2")
@Where(clause = "deleted = false")
public class ServiceEmployee extends Auditable implements Serializable {
@EmbeddedId
private ServiceEmployeeIdentity serviceEmployeeIdentity;
@Column(name = "critical")
private Boolean critical;
@Column(name = "critical_rationale")
private String criticalRationale;
}
@Repository
public interface ServiceEmployeeRepository extends
JpaRepository<ServiceEmployee, ServiceEmployeeIdentity> {}
// test
ServiceEmployee serviceEmployee = ServiceEmployeeBuilder.aServiceEmployee();
serviceEmployeeService.deleteById(
serviceEmployee.getServiceEmployeeIdentity());
@数据
@EqualsAndHashCode(exclude=“serviceEmployeeIdentity”,callSuper=true)
@实体
@审计
@表(name=“服务\员工”)
@SQLDelete(sql=“更新服务\员工”+
“SET deleted=true”+
“其中service_employee.service_id=?1”+
“和服务员工。员工编号=?2”)
@其中(子句=“已删除=错误”)
公共类ServiceEmployee扩展可审核的实现可序列化{
@嵌入ID
私人服务雇员身份服务雇员身份;
@列(name=“critical”)
私有布尔临界;
@列(name=“critical_-rational”)
私有字符串临界原理;
}
@存储库
公共接口服务EmployeeRepository扩展
JpaRepository{}
//试验
ServiceEmployee=ServiceEmployeeBuilder.asServiceEmployee();
serviceEmployeeService.deleteById(
getServiceEmployeeIdentity());
注:
serviceEmployee已设置embeddedId
serviceEmployeeService只调用repository类,这就像它是一个单值
@Id
注释列一样。您只需按照它们在嵌入式类中的表示顺序指定多个列,因此在@SQLDelete
中使用它:
UPDATE service_employee
SET deleted = true
WHERE service_id = ?
AND employee_b_number = ?
我试着为我工作,但顺序是embeddedId列的字母顺序
@SQLDelete(sql = "UPDATE (table_name) SET DELETED=true WHERE event_id = ? and payment_id=?")
如果我使用
@SQLDelete(sql = "UPDATE (table_name) SET DELETED=true WHERE payment_id = ? and event_id=?")
它将不起作用,也不会更新所需的注册表。谢谢您的回复。我试着只使用服务id和员工编号,而不是添加服务员工。在它前面。问题仍然存在。不过,我尝试在repository类中使用本机sql创建自定义“@Query”。查询已执行,但我遇到了“toString”异常。然后,我添加了“@ToString”注释,并在ServiceEmployee类上排除serviceEmployeeIdentity,还在测试中添加了entityManager.flush。我能够看到“@SQLDelete”中的sql被执行,删除标志被更新。