我有以下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;
答案 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;
}