質問
私たちは、基本的な@OneToMany関係を使用しようとしています
@Entity
@Table(name = "PARENT_MESSAGE")
public class ParentMessage {
@Id
@Column(name = "PARENT_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer parentId;
@OneToMany(mappedBy="parentMsg",fetch=FetchType.LAZY)
private List childMessages;
public List getChildMessages() {
return this.childMessages;
}
...
}
@Entity
@Table(name = "CHILD_MSG_USER_MAP")
public class ChildMessage {
@Id
@Column(name = "CHILD_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer childId;
@ManyToOne(optional=false,targetEntity=ParentMessage.class,cascade={CascadeType.REFRESH}, fetch=FetchType.LAZY)
@JoinColumn(name="PARENT_ID")
private ParentMessage parentMsg;
public ParentMessage getParentMsg() {
return parentMsg;
}
...
}
ChildMessage child = new ChildMessage();
em.getTransaction().begin();
ParentMessage parentMessage = (ParentMessage) em.find(ParentMessage.class, parentId);
child.setParentMsg(parentMessage);
List list = parentMessage.getChildMessages();
if(list == null) list = new ArrayList<ChildMessage>();
list.add(child);
em.getTransaction().commit();
私たちは、次のエラーメッセージが表示されます。なぜ、OpenJPAがAPP.PARENT_MESSAGE_CHILD_MSG_USER_MAP
するテーブル名を連結していますか?もちろん、そのテーブルが存在しない...定義されたテーブルがAPP.PARENT_MESSAGE
とAPP.CHILD_MSG_USER_MAP
です。
に起因します: org.apache.openjpa.lib.jdbc.ReportingSQLException: テーブル/ビュー 'APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP' 存在しない。 {SELECT t1.CHILD_ID、 t1.PARENT_ID、t1.CREATED_TIME、 FROM t1.USER_ID APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP T0 INNER JOINは ON APP.CHILD_MSG_USER_MAPさt1 t0.CHILDMESSAGES_CHILD_ID = t1.CHILD_ID WHERE t0.PARENTMESSAGE_PARENT_ID =?} 【コード= 30000、状態= 42X05]
解決
あなたは関係の所有側にmappedBy属性を追加することもできます。これは、一つだけrelatiuonshipはなく二つの異なる関係であることをJPAに伝えます。たぶん、多くの側ます。
他のヒント
あなたは関係をうまくする方法をJPAに伝えるために、あなたのエンティティの関係上だけでなく@JoinColumn
、おそらく@JoinColumns
注釈を使用する必要があると思います。あなたは、エンティティで同じ名前を持つ2つの書き込み可能なフィールドを持つことはできませんので、あなたがinsertable=false, updatable=false
などのエンティティ内に既に存在しているこれらのフィールドを指定する必要があります注意します。