从EntityListener更新 - 还是有更好的方法来实现这一目标?

时间:2013-06-30 17:15:34

标签: java jpa persistence

我有以下JPA实体 - 规则和策略。我希望如此,因此对规则的任何更新都将设置策略的lastModified日期。几个小时后,我发现我无法从EntityListener中调用entityManager。

因此,我的问题是 如何在更新规则时更新策略中的lastModified日期?

@Entity
@Table(name = "strategy")
public class Strategy {

@Id
@GeneratedValue
private Long id;

public void setId(Long id) {
    this.id = id;
}

@Column(nullable = false)
private String name;



@Column
@Temporal(TemporalType.TIMESTAMP)
private Date modifiedDate;



@Table(name = "rule")
@EntityListeners({RuleListener.class})
public class Rule {

@Id
@GeneratedValue
private Long id;

@ManyToOne(/*optional = false, */fetch = FetchType.LAZY)
@JoinColumn(name="STRATEGY_ID"/*, nullable=false*/)  
private Strategy strategy;

@Column(nullable = false)
private String name;

1 个答案:

答案 0 :(得分:0)

我通常会使用@PrePersist@PreUpdate这样的内容。看起来Rule可以直接引用Strategy,因此您可以将@PreUpdate方法放在那里:

@Table(name = "rule")
@EntityListeners({RuleListener.class})
public class Rule {
  // ...

  @PreUpdate
  public void preUpdate() {
    strategy.setModifiedDate(new Date());
  }
}

或者,您可以告诉您与Strategy的{​​{3}}更新之间的关系,并将@PreUpdate放在Strategy中(这样您仍然可以更改modifiedDate如果Strategy独立更新):

@Entity
@Table(name = "strategy")
public class Strategy {
  // ...

  @PreUpdate
  public void preUpdate() {
    modifiedDate = new Date();
  }
}

@Table(name = "rule")
@EntityListeners({RuleListener.class})
public class Rule {
  // ...

  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.UPDATE)
  @JoinColumn(name="STRATEGY_ID"/*, nullable=false*/)  
  private Strategy strategy;
}