2011-07-30 11 views
0

私は、C#エンティティフレームワークの背景から来て、JavaプロジェクトでJPAを見ているので、私が直面しているのは単なる概念的な問題であると考えています。レガシーデータベースに対してJPA関係を追加する方法

スキーマを変更できないレガシーデータベースがあり、DALを作成する必要があります。私は次のエンティティ(例えば簡体字)生成した

...

@Entity 
@Table(name = "crag", catalog = "rad_dbo") 
public class CragEntity { 
    private int id; 

    @Column(name = "id") 
    @Id 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    private int fkSubRegionId; 

    @Column(name = "fk_subRegionId") 
    @Basic 
    public int getFkSubRegionId() { 
     return fkSubRegionId; 
    } 

    public void setFkSubRegionId(int fkSubRegionId) { 
     this.fkSubRegionId = fkSubRegionId; 
    } 
} 

@Table(name = "subRegion", catalog = "rad_dbo") 
@Entity 
public class SubRegionEntity { 
    private int id; 

    @Column(name = "id") 
    @Id 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

は、私がアクセスできるようにCragEntityとの関係を追加しようとしたその小区域

@ManyToOne 
@JoinColumn(name="fk_SubRegionId",nullable=false) 
private SubRegionEntity subRegion; 

が、私は

を実行しようとすると、部分領域:uk.co.bmc.rad.dal.CragEntity

がうまくいけば、これは可能であると私は私が

java.lang.RuntimeException: org.hibernate.QueryException: could 

例外はプロパティを解決できません取得

select c from CragEntity c where c.subRegion.region = :area 

私は遅いです...

何か助けのために事前に多くのおかげで!

答えて

0

それはいくつかの問題があった判明 - 、1つの概念的IntelliJのは、関係I生成されていた方法で1 ...

IntelliJはIntelliJの欠陥ではなく、おそらくスキーマの問題である "間違った"端で、所有者と地域間の関係を選択しました。

private SubRegionEntity subRegion; 

     @ManyToOne 
     @JoinColumn(name="fk_SubRegionId",nullable=false) 
     public SubRegionEntity getSubRegion() { 
      return subRegion; 
     } 

     public void setSubRegion(SubRegionEntity subRegion) { 
      this.subRegion = subRegion; 
     } 

をしてからSubRegionEntityに私がコメントを追加しました::私はそれを実現し、修正を考え出したら、私はCragEntityでCragEntityとSubRegionEntity

に私が追加したコピーができ

private List<CragEntity> crags; 

    @OneToMany(mappedBy = "subRegion") 
    List<CragEntity> getCrags() { 
     return crags; 
    } 

    public void setCrags(List<CragEntity> crags) { 
     this.crags = crags; 
    } 

をまた、それを関係の1つの終わりになるすべてのエンティティクラスは直列化可能(私はエンティティが所有者にシリアライズされると思います。だから、私の部分に

SubRegionEntityとRegionEntityへの愚かさを加える必要なものDOH ...そう、私は、文字列で型RegionEntityのオブジェクトを比較したクエリが c.subRegion.region.nameされている必要があることはもちろんだった - 私の部分で非常に愚かな過ち。

私は(:-)例外やエラーによると、与えられたGoogleのキーワード)いつものように、すぐに私は私が私のエラーを歩いた既存のコードで起こってしなければならないと思った何のためにテストを書いたとしてTDDに新たなんだけど

0

クエリでは、 "subRegion"プロパティを検索していますが、エンティティ定義では "fkSubRegionId"という名前があるため、var名またはクエリを変更する必要があります。 ;)

編集:申し訳ありませんが、私は関係を誤読しました。

コード内の関係を使用して(HQLクエリを作成せずに)プロパティにアクセスできますか?

、あなたはあなたのクエリでのみ特定のフィールドを選択する場合を除き、私はのようなクエリをお勧めします:

from CragEntity c where c.subRegion.region='theRegion' 
関連する問題