JPA连接父/子@OneToMany的表名

时间:2010-03-17 20:43:54

标签: jpa openjpa

我们正在尝试使用基本的@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_MESSAGEAPP.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开   t0.CHILDMESSAGES_CHILD_ID =   t1.CHILD_ID在哪里   t0.PARENTMESSAGE_PARENT_ID =?}   [code = 30000,state = 42X05]

2 个答案:

答案 0 :(得分:3)

您可能希望将mappedBy属性添加到关系的拥有方。这告诉JPA它只是一个关系,而不是两个不同的关系。也许在很多方面。

答案 1 :(得分:0)

您必须在实体关系中使用@JoinColumn和可能@JoinColumns注释来告诉JPA如何计算关系。请注意,您必须将实体中已存在的那些字段指定为insertable=false, updatable=false,因为实体中不能有两个具有相同名称的可写字段。