私はこの問題で立ち往生しています。データベーススキーマは他の誰かによって提供されているので、名前を簡単に変更することはできません。私はどこにでも適切な注釈を追加しようとしました、多分私は何かが欠けています(明らかです)?
これが私の完全なマッピング(かなり多くのクラス)です。ゲッター/セッターは省略します。
問題は、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=?
です。
とにかくそれを機能させることができますか?:/