【问题标题】:Lifecycle event not working for non aggregate entity Spring data jdbc生命周期事件不适用于非聚合实体 Spring 数据 jdbc
【发布时间】:2022-10-13 15:01:37
【问题描述】:

我正在使用 2 个实体,员工和地址。其中 Employee 有控制器来执行 CRUD 操作。因此,对于这两个实体,我都在使用生命周期事件,其中 Employee 事件工作正常,但地址事件没有。所以我试图保存其中有地址的员工(一对一关系),并期望员工和地址这两个生命周期事件都能触发。

请帮我。我在哪里做错了吗?

这是我的代码。

@Table("EMPLOYEE")
@Builder // these are lombok code
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Data
public class Employee {

    @LastModifiedBy
    private String updatedBy;
    @CreatedBy
    private String createdBy;
    private Date dob;
    @Size(max = 10)
    private String name;
    @Id
    private Integer id;
    @LastModifiedDate
    private Date updatedOn;
    @Version
    private Long version;
    @CreatedDate
    private Date createdOn;
    private Integer age;
    @Valid
    private Address address;
}
@Table("ADDRESS")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Data
public class Address {
    private Integer zip;
    @Id
    private Integer id;
    @Size(max = 10)
    @NotNull
    private String line1;
}
@RestController
public class EmployeeController
{
//CRUD APIs code
}
@Component
public class EmployeeEvents
    extends AbstractRelationalEventListener<Employee>
{
    @Override
    protected void onBeforeSave(BeforeSaveEvent event) {
        System.out.println("........"+ event.getEntity());

    }
}
@Component
public class AddressEvents
    extends AbstractRelationalEventListener<Address>
{
    @Override
    protected void onBeforeSave(BeforeSaveEvent event) {
        System.out.println("........"+ event.getEntity());

    }
}

【问题讨论】:

    标签: java spring spring-boot spring-data spring-data-jdbc


    【解决方案1】:
    @OneToOne( cascade = CascadeType.PERSIST)
    private Address address;
    

    【讨论】:

      【解决方案2】:

      使用地址实体进行 OneToOne 映射,然后尝试

      一对一关系的示例,在这种情况下是在用户和地址实体之间。

      @Entity
      @Table(name = "users")
      public class User {
          
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          @Column(name = "id")
          private Long id;
          //... 
      
          @OneToOne(cascade = CascadeType.ALL)
          @JoinColumn(name = "address_id", referencedColumnName = "id")
          private Address address;
      
          // ... getters and setters
      }
      
      
      @Entity
      @Table(name = "address")
      public class Address {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          @Column(name = "id")
          private Long id;
          //...
      
          @OneToOne(mappedBy = "address")
          private User user;
      
          //... getters and setters
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-04
        • 2022-08-22
        • 2014-08-12
        • 1970-01-01
        • 2015-04-21
        • 2014-11-05
        • 2014-07-16
        • 2012-08-11
        相关资源
        最近更新 更多