2017-08-02 13 views
0

JoinTableでJPAマッピングを設定しようとしていますが、Hibernate(JPA実装)がクエリを実行しているときに無視されるようです。中間テーブル(中間エンティティ)を使用して2つのManyToOneを持つJPAマッピング

にユーザーが私のアプリのページを取得するたびに、ユースケースを説明するために

、私は(ユーザーのIDとページのIDを持つ)USAGE_LOGテーブルに行を挿入します。

各ページはカテゴリ(設定、注文、アイテム、ニュースなど)とタイプ(たとえば、作成、更新、表示、削除)に関連しています。

私はある種の中間実体テーブルを持っています。それはページをカテゴリ+タイプにリンクします。トリプレットのように:(ページ、カテゴリ、タイプ)

私のテーブル構造

table USAGE_LOG (for information only, this one works well) 
    ID PrimaryKey 
    USER_ID Foreign key to column ID of table USER 
    USAGE_LOG_PAGE_ID Foreign key to column ID of table USER_LOG_PAGE 

table USAGE_LOG_PAGE 
    ID PrimaryKey 
    URL VARCHAR 
    USER_ACTION_ID Foreign key to column ID of table USER_ACTION 

table USER_ACTION 
    ID PrimaryKey 
    ACTION_CATEGORY_ID Foreign key to column ID of table ACTION_CATEGORY 
    ACTION_TYPE_ID Foreign key to column ID of table ACTION_CATEGORY 

table ACTION_CATEGORY 
    ID PrimaryKey 
    NAME VARCHAR 

table ACTION_TYPE 
    ID PrimaryKey 
    NAME VARCHAR 

だからUSER_ACTIONテーブルは、それがACTION_CATEGORYとACTION_TYPEのにUSAGE_LOG_PAGEをリンクすることを詳細にテーブルを結合です同じ時間。

また、同じACTION_CATEGORYとACTION_TYPEにリンクされている複数のUSAGE_LOG_PAGEを持つことができます。

残念ながら、データベース構造を変更することはできません(これは従来のコードです)。

私はこのマッピングはコンパイルエンティティ "UsageLogPage" に

@ManyToOne 
@JoinTable(name="action", 
     [email protected](name="ID", referencedColumnName="USER_ACTION_ID"), 
     [email protected](name="ACTION_CATEGORY_ID", referencedColumnName="ID")) 
@Getter @Setter 
private ActionCategory actionCategory; 

@ManyToOne 
@JoinTable(name="action", 
    [email protected](name="ID", referencedColumnName="USER_ACTION_ID"), 
    [email protected](name="ACTION_TYPE_ID", referencedColumnName="ID")) 
@Getter @Setter 
private ActionType actionType; 

(私は@Getterと@Setterためにロンボクを使用)

を次Mapppingを試してみましたが、私は取得しようとすると、 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:不明な列「usagelogpa0_.actionCategory」「フィールドリスト」で

実際、Hibernaデータ、私は次の例外がありますTEクエリは次のとおりです。

(キー部分は、セレクトで「actionCategory」と「actionTypeが」である)

select usagelogpa0_.ID as ID1_80_0_, 
    usagelogpa0_.actionCategory as actionCa2_80_0_, 
    usagelogpa0_.actionType as actionTy3_80_0_, 
    usagelogpa0_.URL as URL5_80_0_ 
from usage_log_page usagelogpa0_ 
where usagelogpa0_.ID=? 

これは私が期待するものではありません、Hibernateは参加を行う必要があります。

私が間違っていたことはありますか?

ありがとうございます!調査の多くの後

答えて

0

、私がいることを発見した:私は、属性レベルで@ManyToOneと@JoinTable注釈を入れたので、期待どおりに働いていなかった

  • 。私は手でゲッターを作成し、その上に注釈をつけました。そして、彼らはそれらを考慮に入れました。
  • Hibernateは、実行時にUSAGE_LOG_PAGEテーブルの列 "USER_ACTION_ID"を見つけられなかったので正しく動作しませんでした。この列は、利用可能なフィールドにはありませんでした(私が見つけることができなかった)。エンティティ "UsageLogPage"にフィールド "usage_action_id"を追加すると、その属性が見つかりましたが、USAGE_ACTION_IDが主キーではないため、マッピングの作成が拒否されました。

最後に、データベースを変更できない場合でも、オブジェクトモデルを変更できます。

私は中間のエンティティ "UserAction"を作成し、UsageLogPageエンティティのManyToOneとバインドし、UsageLogPageから属性 "actionCategory"と "actionType"を削除し、新しいUserActionエンティティのManyToOneとして追加しました。

2つの異なるManyToOneリレーションシップの中間エンティティとして機能するテーブルを使用している場合は、オブジェクトモデルに中間エンティティを作成することをお勧めします。

関連する問題