如何获取Hibernate逆向工程工具以生成<bag>或<list>以进行反向关联?</list> </bag>

时间:2010-02-09 19:13:45

标签: java hibernate mapping reverse-engineering

我想在集合中添加元素,最终会像这样映射:

<set name="others" inverse="true" lazy="true" table="other" fetch="select">
  <key>
    <column name="otherId" not-null="true" />
  </key>
  <one-to-many class="my.pkg.OtherEntity" />
</set>

我希望使用Hibernate代替,因为我不关心它们被检索的顺序,我只想保持关联的那一方是最新的。根据{{​​3}},“Hibernate可以添加到&lt; bag&gt;,&lt; idbag&gt;或&lt; list&gt;声明with inverse =”true“而不初始化集合。”

我的问题是我不知道如何强制(或建议)使用逆向工程工具(hibernate-tools.jar)来使用&lt; bag&gt;或&lt; list&gt; - 它始终使用&lt; set&gt;。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用反向工程配置文件自定义逆向工程过程,该文件使用XML语法。我自己没试过,但这个例子可能适合你:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-reverse-engineering SYSTEM
    "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
    <table name="MYTABLE">
        <column name="others" type="bag"/>
    </table>
</hibernate-reverse-engineering>

如果它不能正常工作,您可能会找到有关控制逆向工程过程的更多详细信息here

答案 1 :(得分:0)

你曾经有过List-type而不是Set-type,你可以使用ant-java-task:

<java classname="de.wedeaf.beans.BeanHelper" classpath="WebContent/WEB-INF/classes" args="${basedir}/JavaSource"/>

使用“de.wedeaf.beans.BeanHelper”类:

package de.wedeaf.beans;
import java.io.*;
import org.w3c.dom.NodeList;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class BeanHelper {
 public static void main(String[] args) throws Exception {
  DOMParser parser = new DOMParser();  
  parser.parse("file:///"+args[0]+"/hibernate.cfg.xml");
  NodeList list = parser.getDocument().getElementsByTagName("mapping");
  for (int i = 0; list.item(i) != null; i++) {
   String entityFile = args[0] + File.separatorChar + list.item(i)   .getAttributes().getNamedItem("class").getNodeValue().replace('.', File.separatorChar) + ".java";
   // Eingabe
   FileInputStream in = new FileInputStream(entityFile);
   byte[] code=new byte[in.available()];
   in.read(code);
   in.close();
   // Verarbeitung
   String content=new String(code);
   content = content.replaceAll("java.util.Set", "java.util.List");
   content = content.replaceAll("java.util.HashSet", "jav   a.util.ArrayList");
   content = content.replaceAll(" HashSet<", " ArrayList<");
   content = content.replaceAll("Set<", "List<");
       // Ausgabe
   FileWriter fw = new FileWriter(entityFile);
   fw.write(content);
   fw.close();
     }
 }
}