JPA verketten Tabellennamen für Eltern / Kind @OneToMany
Frage
Wir versuchen, eine grundlegende @OneToMany Beziehung zu verwenden:
@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();
Wir erhalten folgende Fehler. Warum ist verketten OpenJPA die Tabellennamen APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP
? Natürlich, dass Tabelle nicht existiert .. die definierten Tabellen sind APP.PARENT_MESSAGE
und APP.CHILD_MSG_USER_MAP
Verursacht durch: org.apache.openjpa.lib.jdbc.ReportingSQLException: Tabellenansicht 'APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP' ist nicht vorhanden. {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 WHERE t0.PARENTMESSAGE_PARENT_ID =?} [Code = 30000, state = 42X05]
Lösung
Sie können eine mappedBy Attribut an den besitzenden Seite der Beziehung hinzufügen möchten. Dies sagt JPA, dass es nur eine relatiuonship und nicht zwei unterschiedliche Beziehungen. Vielleicht auf der vielen Seite.
Andere Tipps
würden Sie haben die @JoinColumn
zu verwenden und möglicherweise @JoinColumns
Anmerkungen als auch auf Ihrem Entitätsbeziehungen JPA zu sagen, wie die Beziehung zu erarbeiten. Beachten Sie müssen die Felder angeben, die bereits in einer Einheit als insertable=false, updatable=false
sind, da Sie nicht zwei Schreib-able Felder mit dem gleichen Namen in einer Einheit haben können.