JPA Concatenating Table Names for Parent/Child onetomany
سؤال
نحن نحاول استخدام علاقة 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 ، t1.user_id من app.parent_message_child_msg_user_map t0 inner join app.child_msg_user_map t1 on t0.childmessages_child_id = 42x05
المحلول
قد ترغب في إضافة سمة mappedby إلى الجانب المملوك للعلاقة. هذا يخبر JPA بأنه مجرد relatiuonship وليس علاقتين مختلفتين. ربما على الجانب الكبير.
نصائح أخرى
يجب عليك استخدام @JoinColumn
ومحتمل @JoinColumns
التعليقات التوضيحية كذلك على علاقات الكيان الخاصة بك لإخبار JPA كيفية حل العلاقة. لاحظ أنه عليك تحديد تلك الحقول الموجودة بالفعل في كيان مثل insertable=false, updatable=false
نظرًا لأنه لا يمكنك الحصول على حقلين قادرين على الكتابة مع نفس الاسم في كيان.