6

私はこの問題で立ち往生しています。データベーススキーマは他の誰かによって提供されているので、名前を簡単に変更することはできません。私はどこにでも適切な注釈を追加しようとしました、多分私は何かが欠けています(明らかです)?

これが私の完全なマッピング(かなり多くのクラス)です。ゲッター/セッターは省略します。

問題は、Hibernateがすべてを取得しようとしているときですList<ControlRuleAttrib> controlRuleAttribs

コントロールルール

@Entity
@Table(name = "CONTROL_RULE")
public class ControlRule implements Serializable {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "CONTROL_RULE_ID")
 private Long id;
 @ManyToOne(fetch = FetchType.LAZY)
 @Cascade(CascadeType.ALL)
 @JoinColumn(name = "CONTROL_RULE_TYPE_ID")
 @ForeignKey(name = "CONTROL_RULE_TYPE_ID")
 private ControlRuleType controlRuleType;
 @Column(name = "JOB_NM")
 private String jobname;
 @Column(name = "LIBRARY_NM")
 private String libraryname;
 @Column(name = "TABLE_NM")
 private String tablename;
 @Column(name = "COLUMN_NM")
 private String columnname;

 @OneToMany(fetch = FetchType.LAZY)
 @Cascade(CascadeType.ALL)
 @JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {
  @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
 })
 private List < ControlRuleAttrib > controlRuleAttribs;
}

ControlRuleAttrib

@Table(name = "CONTROL_RULE_ATTRIB")
@Entity
public class ControlRuleAttrib {
 @EmbeddedId
 private ControlRuleAttribPK controlRuleAttribPK;

 @Column(name = "ATTRIBUTE_VALUE")
 private String attributeValue;
}

ControleRuleAttribPK ここでの質問は、どういうわけかControlRuleAttribTypeからエンティティを取得することは可能ControlRuleAttribですか?以下に示すようControlRuleAttribTypeIdに、のIDですControleRuleAttribType。オブジェクト全体を整数で取得したいのですが。

@Embeddable
public class ControlRuleAttribPK implements Serializable {
 @Column(name = "CONTROL_RULE_ID")
 private Long controlRuleId;

 @Column(name = "ATTRIBUTE_SEQ_NUM")
 private Integer attributeSeqNum;

 @Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
 private Integer controlRuleAttribTypeId;
}

ControleRuleAttribType

@Entity
@Table(name = "CONTROL_RULE_ATTRIB_TYPE")
public class ControlRuleAttribType implements Serializable {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
 private Integer id;
 @Column(name = "CONTROL_RULE_ATTRIB_TYPE_NM")
 private String typename;
 @Column(name = "CONTROL_RULE_ATTRIB_TYPE_DESC")
 private String typedesc;

 @ManyToOne(fetch = FetchType.LAZY)
 @Cascade(CascadeType.ALL)
 @JoinColumn(name = "CONTROL_RULE_TYPE_ID")
 @ForeignKey(name = "CONTROL_RULE_TYPE_ID")
 private ControlRuleType controlruletype;
}

ControleRuleType

@Entity
@Table(name = "CONTROL_RULE_TYPE")
public class ControlRuleType implements Serializable {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "CONTROL_RULE_TYPE_ID")
 private Integer id;
 @Column(name = "CONTROL_RULE_TYPE_NM")
 private String typename;
 @Column(name = "CONTROL_RULE_TYPE_DESC")
 private String typedesc;
}

編集

スタックトレースは次のとおりです。

https://gist.github.com/a30dd9ce534d96bb9a97

ご存知のとおり、ここでは失敗します。

com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)[クラス:]

そしてこれはそれです:

List<ControlRule> list = SessionFactoryUtils.openSession(
    sessionFactory ).createQuery( "from ControlRule" ).list();
System.out.println( list );

私が追加したマッピングのすべてのオブジェクトには、toString()次のように宣言されたメソッドがあります。

@Override
public String toString()
{
    String s = "ControlRule{";
    s += "id=" + id.toString();
    s += ", controlRuleType=" + controlRuleType;
    s += ", jobname='" + jobname + '\'';
    s += ", libraryname='" + libraryname + '\'';
    s += ", tablename='" + tablename + '\'';
    s += ", columnname='" + columnname + '\'';
    s += ", controlRuleAttribs=" + controlRuleAttribs;
    s += '}';
    return s;
}

そして休止状態のリクエスト:

https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26

助けてください :)

編集2

@Jensの回答を読んだ後、コードにいくつかの変更を加えました。最初に私はあなたが書いたようにしました、そしてそれはエラーを与えました:

org.hibernate.AnnotationException:com.execon.models.controlrules.ControlRuleからcom.execon.models.controlrules.ControlRuleAttribを参照する外部キーの列数が間違っています。3である必要があります

私は複合主キーを持っているので、これは正しいと思います。

それから私はそれをこのように試しました:

@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB",
        joinColumns = {
                @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
        },
        inverseJoinColumns = {
                @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false),
                @JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID", nullable = false, updatable = false),
                @JoinColumn(name = "ATTRIBUTE_SEQ_NUM", nullable = false, updatable = false)
        })
private List<ControlRuleAttrib> controlRuleAttribs;

非常に近いですが、次の例外があります。

コレクションのマッピングで繰り返される列。

だからついに私は削除しました

joinColumns = 
{
    @JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
}

そして、コレクションに到達しようとしたときにHibernateが次のクエリを実行することを除いて、すべてがコンパイルされました。

https://gist.github.com/c88684392f0b7a62bea5

最後の行は、controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=?あるべき間controlrul0_.CONTROL_RULE_ID=?です。

とにかくそれを機能させることができますか?:/

4

3 に答える 3

0

どの識別子が長すぎるかは明確にはわかりませんが、@Id注釈付きフィールドタイプをからIntegerに変更してみることを提案できますLong。そして、あなたの問題に関するいくつかの詳細な情報(スタックトレースなど)を取得するのは素晴らしいことです。

于 2012-07-10T13:30:23.133 に答える
0

問題はコラム

CONTROL_RULE_ATTRIB.controlRuleAttribs_CONTROL_RULE_ATTRIB_TYPE_ID

これは非常に長いため、データベースに存在できない可能性があります。質問には実際にどのように名前が付けられているかのヒントはありませんが、適切な名前は

CONTROL_RULE_ATTRIB.CONTROL_RULE_ATTRIB_TYPE_ID

問題は、なぜ hibernate がこの列にアクセスしようとしているのかということです。それが入っているテーブルは、休止状態で次のようにマッピングされるマッピングテーブルです。

@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)})
private List<ControlRuleAttrib> controlRuleAttribs;

@JoinTable アノテーションを見ると、使用されているテーブル名と結合列が定義されていることがわかります。ただし、マッピング テーブルには 2 セットの結合列があります。2回目以降は特に指定はありません。したがって、構成した NamingStrategy が使用されます。構成していない場合は、デフォルトが使用されます。属性 inverseJoinColumns を使用して結合列の他のセットを指定するだけで、すべて問題ありません。

完全な注釈は次のようになります。

@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID")})

注:その列にもnull可能で更新可能なものが必要かどうかはわかりません。

JoinTable アノテーションのドキュメントも参照してください

于 2012-07-10T19:43:11.730 に答える