我正在从数据库生成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查询语言: 列表选项列表= session.createQuery(“FROM Picklist”)。list();
我收到如下错误:“org.hibernate.exception.SQLGrammarException:'field list'中的未知列'picklist0_.uniqueID'”
我知道我收到此错误,因为我的DataBase表中没有这样的字段,我认为这是因为hibernate尝试从它生成的属性名称中获取字段名称。但是,DelegatingReverseEngineeringStrategy中没有“PropertyNameToColumn”这样的方法来进行反向名称转换。知道我错过了什么吗?再次感谢
答案 0 :(得分:2)
您可以为逆向工程策略创建一个类,该策略可以扩展任何已定义的策略,如“DelegateRevereseEngineeringStrategy”或“DefaultReverseEngineeringStrategy”。然后,覆盖提供的方法
要排除列,请覆盖以下方法
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;
}
您也可以使用reveng.xml文件执行这些操作。有关更多提示,请参阅此post