Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate反向工程扩展超类,使其具有通用的getter/setter_Java_Hibernate - Fatal编程技术网

Java 如何使用Hibernate反向工程扩展超类,使其具有通用的getter/setter

Java 如何使用Hibernate反向工程扩展超类,使其具有通用的getter/setter,java,hibernate,Java,Hibernate,我正在从数据库生成java类(使用Hiberndate反向工程)。我生成的所有类都将具有类似的内容(只是为了确保uid_uxxxxx是DB表中的主键): 所以我写了这个课程: @MappedSuperclass public abstract class HibernateObject implements Serializable { protected Integer uniqueID; @Id @GeneratedValue(strategy = IDENTITY)

我正在从数据库生成java类(使用Hiberndate反向工程)。我生成的所有类都将具有类似的内容(只是为了确保uid_uxxxxx是DB表中的主键):

所以我写了这个课程:

@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_uuxxxxx”属性,而是将值保存到父级的属性“uniqueID”中。我可以手动完成,但我经常发现自己必须重新生成类,这就是为什么我希望反向工程过程来完成它

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

下面是我读了你的建议后得出的结论:


好吧,我按照你的指示做了,结果如下:

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

公共类MyReverseEngineeringStrategy扩展了DelegatingReverseEngineeringStrategy{
公共逆向工程战略(逆向工程战略){
高级(大使馆);
}
@凌驾
公共字符串ColumntPropertyName(表标识符表,字符串列){
if(column.startsWith(“uid_”)){
返回“唯一标识”;
}
否则{
返回super.columntropertyname(表,列);
}
}
@凌驾
公共映射TableToMetaAttribute(TableIdentifier TableIdentifier){
@抑制警告(“未选中”)
Map metaAttributes=super.tableToMetaAttributes(tableIdentifier);
if(元属性==null){
metaAttributes=newHashMap();
}
//所有生成的类都将扩展utils.HibernateObject类
MetaAttribute ExtendAttribute=新的MetaAttribute(“扩展”);
extendsAttribute.addValue(“utils.HibernateObject”);
放置(“扩展”,extendsAttribute);
返回元属性;
}
}
现在,我的所有hibernate方法都扩展了HibernateObject,由于id的参数名为“uniqueID”,因此代码生成器创建的getter和setter将覆盖所需的函数

不过,我仍然有一个(小)问题:当我像这样使用HQL查询语言时: List picklist=session.createQuery(“来自picklist”).List()

我得到一个类似这样的错误:“org.hibernate.exception.sqlgrammareexception:field list'中的未知列'picklist0..uniqueID'”


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

您可以为反向工程策略创建一个类,该类扩展了任何定义的策略,如“DelegateReverseeEngineeringStrategy”或“DefaultReverseeEngineeringStrategy”。然后,重写提供的方法

  • 要排除该列,请重写以下方法

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

    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;
    }
    
    公共映射tableToMetaAttributes(TableIdentifier TableIdentifier){
    Map metaAttributes=super.tableToMetaAttributes(tableIdentifier);
    if(元属性==null){
    metaAttributes=newHashMap();
    }
    //所有生成的类都将扩展com.abc.Test类
    MetaAttribute ExtendAttribute=新的MetaAttribute(“扩展”);
    extendsAttribute.addValue(“com.abc.Test”);
    放置(“扩展”,extendsAttribute);
    返回元属性;
    }
    

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

    好的,因此我按照您的说明进行了操作,结果如下:公共抽象类HibernateObject实现了可序列化的{public abstract Integer getUniqueID();公共抽象void setUniqueID(Integer aUID);}很抱歉最后的评论,我不太熟悉stackoverflow的评论/发布方式,请参阅编辑以了解实际的评论
    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;
      }
    }
    
    public boolean excludeColumn(TableIdentifier identifier, String columnName) {
      if(columnName.startsWith("uid_")) {
         return true;
      }
      return delegate==null?false:delegate.excludeColumn(identifier, columnName);
    }
    
    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;
    }