使用DelegatingReverseEngineeringStrategy进行Hibernate逆向工程

时间:2014-12-13 00:34:58

标签: hibernate reverse-engineering hibernate-tools hbm

我正在尝试使用DelegatingReverseEngineeringStrategy生成pojos和hbm文件。我可以自定义诸如实现接口,toString方法,所有表对象的eager fetch之类的东西。

但是,我需要自定义另外两个功能:

考虑两个表Parent和Child,其中Parent和Child之间存在一对多的关系。

我想:

  1. set inverse =" false"用于父母hbm中的子集合

  2. 设置级联="全部" for parent hbm中的Child集合,这样如果我更新Parent集合,它应该将效果级联到子集合。

    <hibernate-mapping>
     <class name="com.xyz.Parent" table="PARENT" schema="FAMILY">
      <meta attribute="implements" inherit="false">SomeInterface</meta>
      <meta attribute="extra-import" inherit="false">com.xyz.SomeInterface</meta>
       <property name="parentColumn" type="date">
        <meta attribute="use-in-tostring" inherit="false">true</meta>
        <column name="PARENT_COLUMN" length="7" />
      </property>
     <set name="child" table="Child" **inverse="false"** lazy="false" fetch="select" **cascade="all"**>
     <key>
       ....
      </key>
     <one-to-many class="com.xyz.Child" />
     </set>
    </class>
    </hibernate-mapping>
    
  3. 在Child的hbm中将Parent排除为外键 - 以避免在代码中反向查找。

    <hibernate-mapping>
     <class name="com.xyz.Child" table="CHILD" schema="FAMILY">
      <meta attribute="implements" inherit="false">SomeInterface</meta>
      <meta attribute="extra-import" inherit="false">com.xyz.SomeInterface</meta> 
      <property name="childColumn" type="date">
        <meta attribute="use-in-tostring" inherit="false">true</meta>  
        <column name="CHILD_COLUMN" length="7" />
      </property>
    </composite-id>
    **-- I do not want this in CHILD 
    <many-to-one name="parent" class="com.xyz.Parent" update="false" insert="false" fetch="select">
    <meta attribute="use-in-tostring" inherit="false">true</meta>
    ....
    </many-to-one>**
    </class>
    </hibernate-mapping>
    
  4. 有没有办法找出DelegatingReverseEngineeringStrategy中的关联信息?某些类可以为每个表提供一对多,一对一等信息。

1 个答案:

答案 0 :(得分:1)

似乎可以通过重写DelegatingReverseEngineeringStrategy.foreignKeyToAssociationInfo(ForeignKey)来实现,但是在实体创建构建过程中似乎根本没有调用该函数:(

在构建完成后,可以通过maven进行正则表达式替换。有些人喜欢 查找

@ManyToOne\((.*)\)[\r\n\s]+@JoinColumn\((.*)\)[\r\n\s]+public Entity getEntity\(\)

替换为

@ManyToOne($1, cascade=javax.persistence.CascadeType.ALL)\r\n\t@JoinColumn($2, updatable=false, insertable=false)\r\n\tpublic Entity getEntity()