Java 如何在Spring Roo DBRE生成的实体中自定义setter?

Java 如何在Spring Roo DBRE生成的实体中自定义setter?,java,spring,aspectj,spring-roo,Java,Spring,Aspectj,Spring Roo,这个问题可能会暴露出我对AspectJ的缺乏了解,但无论如何,我还是要问:) 我已经成功地使用SpringRoo将一组表逆向工程到一个新的Roo项目中。我希望能够通过不将我的方面“推”到普通的旧Java类中来保持Roo的往返工程方面。但是,我在为方面中定义的成员字段赋值时遇到了一个问题 例如,我有一个RoodManaged实体类,我们称之为X,Roo生成了一个方面:X_Roo_DbManaged。现在,我想为字段'updateDate'定制一个setter,以便在持久化时将日期指定为当前日期。因

这个问题可能会暴露出我对AspectJ的缺乏了解,但无论如何,我还是要问:)

我已经成功地使用SpringRoo将一组表逆向工程到一个新的Roo项目中。我希望能够通过不将我的方面“推”到普通的旧Java类中来保持Roo的往返工程方面。但是,我在为方面中定义的成员字段赋值时遇到了一个问题

例如,我有一个RoodManaged实体类,我们称之为X,Roo生成了一个方面:X_Roo_DbManaged。现在,我想为字段'updateDate'定制一个setter,以便在持久化时将日期指定为当前日期。因此,我将自定义代码放在类X中,如下所示:

 public void setUpdateDate(Date updateDate) {
    this.updateDate = new Date();
}

这导致Roo从方面删除setter,正如我所期望的,因为我现在已经在X中定义了它

这给了我一个错误: 字段X.updateDate不可见

如果我将X_Roo_DbManaged方面中字段的可见性更改为“public”(我宁愿不这样做),这将解决问题,直到Roo自动重新生成导致错误再次发生的方面

我的猜测是,我遗漏了一些显而易见的东西,以至于没有人认为这是值得发布的,因为我通常成功的谷歌搜索没有找到任何解决方案


我应该补充一点,我的解决方法是通过将X_Roo_控制器中的相关方法移动到XController中,并使用未修改的setter在其中分配日期,从而自定义这些方法。这似乎是违反直觉的,因为我真的希望updateDate总是设置为当前日期。有趣的是,在updateDate字段上Roo生成的@Temporal(TemporalType.TIMESTAMP)注释不提供此功能。我真的希望能够用一个Roo命令告诉Roo,某些DBRE字段应该有这种行为,而不必担心本质上的“管道”问题。

我建议您使用
@PrePersist
@PreUpdate
而不是黑客攻击setter

public class X {
   @PreUpdate
   public void beforeSaving() {
      this.setUpdateDate(new Date());
   }
}

否则,您仍然可以将字段本身从
X\u Roo\u DbManaged.aj
放入
X.java
文件中,但您将失去对该字段进行增量反向工程的能力。

您可以将字段updateDate移动到X.java中,使其可见