3

基本的な@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 ON t0.CHILDMESSAGES_CHILD_PAR_ 42X05]

4

2 に答える 2

4

リレーションシップの所有側にmappedBy属性を追加することをお勧めします。これはJPAに、それは1つの関係であり、2つの異なる関係ではないことを示しています。多分多面的に。

于 2010-03-17T20:55:24.187 に答える
0

エンティティの関係で@JoinColumn、場合によってはアノテーションも使用して、 JPAに関係の解決方法を指示する必要があります。エンティティに同じ名前の書き込み可能なフィールドを2つ持つことはできないため@JoinColumns、エンティティにすでに存在するフィールドを指定する必要があることに注意してください。insertable=false, updatable=false

于 2010-03-17T20:48:15.803 に答える