java - 如何使用 Hibernate 逆向工程扩展父类(super class)以具有通用的 getter/setter

标签 java hibernate

我正在从数据库生成 Java 类(使用 Hiberndate 逆向工程)。我所有生成的类都会有这样的东西(只是为了确保 uid_xxxxx 是数据库表中的主键):

private Integer uidCompany;

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "uid_company", unique = true, nullable = false)
public Integer getUidCompany() {
  return this.uidCompany;
}

public void setUidCompany(Integer uidCompany) {
this.uidCompany = uidCompany;
}

所以我写了这个类:

@MappedSuperclass
public abstract class HibernateObject implements Serializable {
   protected Integer uniqueID;

   @Id
   @GeneratedValue(strategy = IDENTITY)
   public Integer getUniqueID() {
   return this.uniqueID;
   }

   public void setUniqueID(Integer aUID) {
   this.uniqueID = aUID;
   }
}

我希望从 hibernate 逆向工程生成的所有类都可以扩展它。正如您可能猜到的那样,我还希望不创建“uid_xxxxx”属性,而是将值保存到父属性的“uniqueID”中。我可以手动完成,但我经常发现自己不得不重新生成我的类,这就是为什么我希望逆向工程过程来完成它。

我环顾四周,发现这些链接很有用,但我想我还是遗漏了一些东西。任何帮助将不胜感激!

http://ocpsoft.org/java/hibernate-use-a-base-class-to-map-common-fields/

http://www.myeclipseide.com/documentation/quickstarts/hibernate/

How do I override the GenerationType strategy using Hibernate/JPA annotations?

/******************************************EDIT******************************/

在阅读了您的建议后,我得出的结论是:

好的,所以我按照您的指示进行操作,结果如下:

public abstract class HibernateObject implements Serializable {
public abstract Integer getUniqueID();  
public abstract void setUniqueID(Integer aUID);
}

public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
public MyReverseEngineeringStrategy(ReverseEngineeringStrategy aDelegate) {
super(aDelegate);
}

@Override
public String columnToPropertyName(TableIdentifier table, String column) {
 if(column.startsWith("uid_")) {
  return "uniqueID";
 }
 else {
  return super.columnToPropertyName(table, column);
 }
}

@Override
public Map<String, MetaAttribute> tableToMetaAttributes(TableIdentifier tableIdentifier) {
 @SuppressWarnings("unchecked")
 Map<String, MetaAttribute> metaAttributes = super.tableToMetaAttributes(tableIdentifier);

  if(metaAttributes == null) {
   metaAttributes = new HashMap<String, MetaAttribute>();
  }

  // All generated classes will extend utils.HibernateObject class
  MetaAttribute extendsAttribute = new MetaAttribute("extends");
  extendsAttribute.addValue("utils.HibernateObject");
  metaAttributes.put("extends", extendsAttribute);

  return metaAttributes;
  }
}

现在我所有的 hibernate 方法都扩展了 HibernateObject,并且由于 id 的参数被命名为“uniqueID”,代码生成器创建的 getter 和 setter 覆盖了所需的函数。

不过我仍然有一个(小)问题:当我像这样使用 HQL 查询语言时: List picklist = session.createQuery("FROM Picklist").list();

我收到这样的错误:“org.hibernate.exception.SQLGrammarException:‘字段列表’中的未知列‘picklist0_.uniqueID’”

我知道我得到这个错误是因为我的数据库表中没有这样的字段,我认为这是因为 hibernate 试图从它生成的属性名称中获取字段名称。但是,DelegatingReverseEngineeringStrategy 中没有“PropertyNameToColumn”这样的方法来进行反向名称转换。知道我错过了什么吗?再次感谢

最佳答案

您可以为逆向工程策略创建一个类,它扩展任何已定义的策略,如“DelegateRevereseEngineeringStrategy”或“DefaultReverseEngineeringStrategy”。然后,覆盖提供的方法

  1. 要排除该列,重写下面的方法

    public boolean excludeColumn(TableIdentifier identifier, String columnName) {
      if(columnName.startsWith("uid_")) {
         return true;
      }
      return delegate==null?false:delegate.excludeColumn(identifier, columnName);
    }
    
  2. 要从基类扩展生成的类,使用方法添加元属性

    public Map<String, MetaAttribute> tableToMetaAttributes(TableIdentifier tableIdentifier) {
    
      Map<String, MetaAttribute> metaAttributes = super.tableToMetaAttributes(tableIdentifier);
    
      if(metaAttributes == null) {
        metaAttributes = new HashMap<String, MetaAttribute>();
      }
      // All generated classes will extend com.abc.Test class
      MetaAttribute extendsAttribute = new MetaAttribute("extends");
      extendsAttribute.addValue("com.abc.Test");
      metaAttributes.put("extends", extendsAttribute);
      return metaAttributes;
    }
    

您也可以使用 reveng.xml 文件执行这些操作。有关更多提示,请参阅此 post

关于java - 如何使用 Hibernate 逆向工程扩展父类(super class)以具有通用的 getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16122878/

相关文章:

java - java web应用程序中的文件上传显示文件未找到异常

java - hibernate 保存/更新级联

java - 将 java 应用程序作为 jar 运行时的 log4j 警告(请正确初始化 log4j 系统。)

java - 如何创建类错误?

Java Swing 编程面板标题

java - JPA Cascade Save 中的问题,并在子级中使用 EmbeddedId

spring - 没有@EmbeddedId 或@IdClass 的 super 简单复合键

java - 不提交 Hibernate Select 事务的后果

java - jboss 没有建立 hibernate/JNDI 连接

java - 多幻灯片表示