题
我们试图使用一个基本@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 FROM APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP T0 INNER JOIN APP.CHILD_MSG_USER_MAP T1 ON t0.CHILDMESSAGES_CHILD_ID = t1.CHILD_ID WHERE t0.PARENTMESSAGE_PARENT_ID =?} [代码= 30000,状态= 42X05]
解决方案
您可能需要一个的mappedBy属性添加到关系的持有端。这告诉JPA,这是唯一一个relatiuonship,而不是两个不同的关系。也许在许多侧。
其他提示
您不得不使用@JoinColumn
并可能@JoinColumns
注解以及你的实体关系告诉JPA如何计算出的关系。注意你必须,因为你不能有两个可写的领域与实体相同的名称来指定那些已经存在于实体insertable=false, updatable=false
领域。