2


我正在尝试实现一个 FreeMarker 自定义逆向工程模板,该模板会自动创建我的 Hibernate 类。
在构建过程中,模板被 hibernate-tools 用来生成休眠类。
到目前为止,我为此目的使用了默认的 freemarker 模板,并且效果很好。

但是现在我面临一个问题:
如何向默认的 getter-annotations 添加其他属性

One-to-may 关联的默认 freemarker 方法是(在 Ejb3PropertyGetAnnotation.ftl 中实现):

...
<#elseif c2h.isCollection(property)>
    ${pojo.generateCollectionAnnotation(property, cfg)}
...

生成的java代码例如:

@OneToMany(fetch=FetchType.LAZY, mappedBy="person")      
public Set<ContactInformation> getContactInformations() {
    return this.contactInformations;
}

但我想将cascade = CascadeType.ALL添加到每个一对多的 g​​etter 注释中,如下所示:

@OneToMany(cascade = CascadeType.ALL
           fetch=FetchType.LAZY, mappedBy="person")

我是 freemarker 和 hibernate 的新手,不知道如何存档。

非常感谢你的帮助!

4

2 回答 2

1

答案更简单:只需将${property.setCascade("ALL")}放在generateCollectionAnnotation方法调用之前。

<#elseif c2h.isCollection(property)>
${property.setCascade("ALL")}
${pojo.generateCollectionAnnotation(property, cfg)}

结果也更好,因为它使用了 javax.persistence.CascadeType 枚举。

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
public Set<ContactInformation> getContactInformations() {

可以使用的级联类型列表:

${property.setCascade("persist, merge, delete, refresh")}

结果:

@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH }, fetch=FetchType.LAZY, mappedBy="person") 
public Set<ContactInformation> getContactInformations() {

此解决方案还为 ManyToMany 关系生成级联类型。如果你不喜欢这种行为,你需要控制它。可以生成 @OneToMany orphanRemoval 属性,但不在问题范围内。

亲切的问候。

于 2016-08-07T10:17:00.773 回答
0

我发现,注释

cascade = CascadeType.All  

不一定必须在@OneToMany 方法的签名中。

解决方案是在 Freemarker 模板文件 Ejb3PropertyGetAnnotation.ftl 中添加以下行:

   @${pojo.importType("org.hibernate.annotations.Cascade")}(value=${pojo.importType("org.hibernate.annotations.CascadeType")}.ALL) 

总而言之,@OneToMany 的方法模板看起来像这样

<#elseif c2h.isCollection(property)>
   ${pojo.generateCollectionAnnotation(property, cfg)}
   @${pojo.importType("org.hibernate.annotations.Cascade")}(value=${pojo.importType("org.hibernate.annotations.CascadeType")}.ALL)                    
<#else> 

结果将是fi:

  @OneToMany(fetch=FetchType.LAZY, mappedBy="person")
  @Cascade(value=CascadeType.ALL)                    
  public Set<ContactInformation> getContactInformations() {
       return this.contactInformations;
  }             
于 2012-09-06T07:27:28.687 回答