부모/자식 @onetomany에 대한 JPA 테이블 이름을 연결합니다
문제
우리는 기본 @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 : table/view 'app.parent_message_child_msg_user_map'은 존재하지 않습니다. {t1.child_id, t1.parent_id, t1.created_time, t1.user_id from app.parent_message_child_msg_user_map t0 내부 조인 app.child_msg_user_map t1 on t0.childmessages_child_id = t1.child_id where where where where where where where where where where where where where where where where where where where where where and child_msg_user_map t1 42x05
해결책
관계의 소유 측면에 mappedby 속성을 추가 할 수 있습니다. 이것은 JPA에게 하나의 친척 일 뿐이며 두 가지 다른 관계가 아니라는 것을 알려줍니다. 어쩌면 많은면에서.
다른 팁
당신은 그것을 사용해야합니다 @JoinColumn
그리고 아마도 @JoinColumns
JPA에 관계를 해결하는 방법을 알려주는 엔티티 관계에 대한 주석. 참고 엔티티에 이미 존재하는 필드를 지정해야합니다. insertable=false, updatable=false
엔티티에서 동일한 이름을 가진 두 개의 쓰기 가능한 필드를 가질 수 없기 때문입니다.