2016-07-08 23 views
0

私たちの製品では、自動生成された休止状態エンティティを使用して、カスタマイズ可能なデータベーススキームを当社のサーバーソフトウェアにリンクすることができます。エンティティ名とプロパティ名は、データベースから取得されます。特に、プロパティ名は、ハイバーネーションデータレイヤーとは無関係のユーザーコード(例えば、Pythonスクリプト)で使用されるため、通常は変更できません。hibernateエンティティで大文字のプロパティを使用するには

これらのプロパティ名の一部は大文字になります。

org.hibernate.QueryException: could not resolve property List_id 
    at org.hibernate.QueryException.generateQueryException(QueryException.java:137) 
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) 

例えば、例外のためのいくつかのコードスニペット:

@Entity(name = "ListItem") 
@Table(name = "LIST_ITEM") 
public class ListItem 
    extends HibernatePojoClass 
{ 
    private String List_id = ""; 

    @Column(name = "`LIST_ID`", length = 8) 
    public String getList_id() { 
     return List_id; 
    } 

    public void setList_id(String List_id) { 
     this.List_id = List_id; 
    } 
... 

とHQLの声明: select li.id, li.List_id from ListItem li

の例外がときに発生するなど、これらのプロパティ名は例外で失敗使っHQL文hibernateは、hql文をSQL文に変換しようとします。

どうしてですか?

hqlステートメントでli.list_idを使用すると、プロパティが解決されたようですが(これは別のエラーにつながります)。この暗黙の「資本化の変化」をどうにかして防ぐことができますか?

+0

使用 '名=「LIST_IDを」'強調し、コードカラーリングのようなIDEの機能にあまり依存になるでしょう。 – Thomas

+0

これは見つからないプロパティ名( "List_id")であるため、これは何も変わらないとは思っていません... –

+1

Hibernateはおそらく '@Column'アノテーションで提供されている名前では問題を抱えているので、メタモデルを作成する。ちょうどそれを修正しようとすると安全です。それ以外にgetterを使ってプロパティを定義するときHibernateはgetterから 'get'を取り除き、最初の文字を小文字にします。したがって' getList_id'はプロパティが 'list_id'という名前になります(Btw、Javaコード問題ではない慣習)。 – Thomas

答えて

1

JPAには、プロパティアクセスとフィールドアクセスの2つの基本アクセスモードがあります。

プロパティへのアクセスは、あなたがゲッターを必要とする小文字と大文字で同じ文字を持って対応するgetter/setterメソッド、つまりフィールドlistIdで始まるフィールド名を必要があることを意味するJava Beansの規則を遵守する必要がありますgetListId()

したがって、フィールドアクセスを使用して、Hibernateにフィールド名をそのまま使用させる必要があります。エンティティのIDにフィールドアクセスを使用するもう1つの利点は、IDを取得するためにレイジーロードを行う必要がないことです。これは、Hibernateでのプロパティアクセスでは不可能です。

詳細については、JPA specificationのセクション2.2と2.3を参照してください。

最終的なアドバイスですが、すでに述べたように、私のコメントにはJavaコードの規約を守ってください。これを行うメリット:

  • ここではSOなどの人とコミュニケーションしやすくなります(通常、大文字で始まる名前は通常クラス名とみなされます)。
  • Java ecoシステムのライブラリではほとんどの場合同じ規則を使用しているため、Javaベースのライブラリ(JavaBeans、JavaELなど)を使用しているため、問題は少なくなります。
  • エラーを見つけやすくなり、例えばなど
  • クラスではなくフィールドまたは変数を使用すると、エラーがダニなし、など
3

あなたは

@Column(name = "`LIST_ID`", length = 8) 
public String getList_id() { 
    return List_id; 
} 

を使用する場合はもちろん、HQLにlist_idとしてそのプロパティを参照する必要があります。

Hibernateは命名戦略を使用して列名を生成できます。 Hibernate 4のImprovedNamingStrategyは、たとえ指定したとしても、カラム名を小文字に変換します。私は引用符わからないですが、このために:

@Column(name = "LIST_ID", length = 8) 
public String getList_id() { 
    return List_id; 
} 

あなたはlist_id列名を持つことになりますImprovedNamingStrategy使用します。

独自の命名方法を使用して、正しい列名を生成できます。

関連する問題