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

时间:2012-01-06 23:41:04

标签: java spring aspectj spring-roo

这个问题可能会暴露我对AspectJ缺乏了解,但无论如何都会这样:)

我已经成功地将Spring Roo用于数据库反向工程将一堆表格转换为新的Roo项目。我希望能够通过“推动”来保持Roo的往返工程方面。我的方面成为普通的旧Java类。但是,我遇到了为Aspect中定义的成员字段分配值的问题。

例如,我有一个RooDbManaged实体类,让我们称之为X,而Roo已经生成了一个方面:X_Roo_DbManaged。现在,我想为字段自定义一个setter" updateDate'这样我就可以将日期指定为持久性时的当前日期。所以,我已将我的自定义代码放在类X中,如下所示:

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

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

这会导致Roo从方面移除setter,正如我所料,因为我现在已经在X中定义了它。

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

如果我将X_Roo_DbManaged方面中字段的可见性更改为' public' (这是我不愿意做的事情),这解决了这个问题,直到Roo自动重新生成导致错误重现的方面。

我的猜测是,我错过了一些显而易见的事情,没有人认为值得发帖,因为我通常成功的谷歌搜索未能找到任何解决方案!

我应该补充一点,我的解决方法是通过将X_Roo_Controller中的相关方法移动到XController并使用未修改的setter分配日期来自定义相关方法。这似乎是反直觉的,因为我真的希望updateDate始终是设置时的当前日期。有趣的是,updateDate字段上的Roo生成的@Temporal(TemporalType.TIMESTAMP)注释不提供此功能。我真的希望能够告诉Roo一个Roo命令,某些DBRE字段应该有这种行为,而不必担心本质上是什么' plumbing'。

2 个答案:

答案 0 :(得分:2)

我建议您使用@PrePersist@PreUpdate而不是黑客入侵者

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

否则,您仍然可以将字段本身从X_Roo_DbManaged.aj放入X.java文件,但是您将失去对该字段进行递增反向工程的功能。

答案 1 :(得分:0)

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