1

データベースから Java クラスを生成しています (Hiberndate リバース エンジニアリングを使用)。生成されたすべてのクラスは次のようになります (念のため、uid_xxxxx は DB テーブルの主キーです)。

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;
   }
}

休止状態のリバース エンジニアリングから生成されたすべてのクラスを拡張したいと考えています。おそらくご想像のとおり、「uid_xxxxx」属性を作成せずに、値を親の属性「uniqueID」に保存することも必要です。手動で行うこともできますが、クラスを再生成しなければならないことがよくあります。そのため、リバース エンジニアリング プロセスでそれを行う必要があります。

少し見回したところ、これらのリンクが役立つことがわかりましたが、まだ何かが足りないと思います。どんな助けでも大歓迎です!

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

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

Hibernate/JPA アノテーションを使用して GenerationType 戦略をオーバーライドするにはどうすればよいですか?

/******************************************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」になっているため、コード ジェネレーターによって作成されたゲッターとセッターが必要な関数をオーバーライドします。

ただし、まだ (マイナーな) 問題があります: 次のような HQL クエリ言語を使用する場合: List picklist = session.createQuery("FROM Picklist").list();

次のようなエラーが表示されます:「org.hibernate.exception.SQLGrammarException: 不明な列 'picklist0_.uniqueID' in 'field list'」

データベーステーブルにそのようなフィールドがないため、このエラーが発生することはわかっています.hibernateが生成した属性名からフィールド名を取得しようとするために発生すると思います. ただし、逆の名前変換を行う DelegatingReverseEngineeringStrategy には "PropertyNameToColumn" のようなメソッドはありません。私が見逃したものは何か分かりますか?再度、感謝します

4

1 に答える 1