Les noms de table JPA pour concaténer parent / enfant @OneToMany
Question
Nous essayons d'utiliser une relation de @OneToMany de base:
@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();
Nous recevons l'erreur suivante. Pourquoi OpenJPA concaténer les noms de table à APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP
? Bien sûr, ce tableau n'existe pas .. les tables sont définies APP.PARENT_MESSAGE
et APP.CHILD_MSG_USER_MAP
Causé par: org.apache.openjpa.lib.jdbc.ReportingSQLException: Table / Voir 'APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP' n'existe pas. {SELECT t1.CHILD_ID, t1.PARENT_ID, t1.CREATED_TIME, t1.USER_ID DE APP.PARENT_MESSAGE_CHILD_MSG_USER_MAP t0 INNER JOIN APP.CHILD_MSG_USER_MAP t1 t0.CHILDMESSAGES_CHILD_ID = t1.CHILD_ID OÙ t0.PARENTMESSAGE_PARENT_ID =?} [Code = 30000, state = 42X05]
La solution
Vous pouvez ajouter un attribut mappedBy à côté de la relation possédante. Cela dit JPA qu'il n'y a qu'un seul relatiuonship et non deux relations différentes. Peut-être sur le côté plusieurs.
Autres conseils
Il faudrait utiliser le @JoinColumn
et éventuellement des annotations @JoinColumns
ainsi vos relations avec l'entité à dire JPA comment travailler la relation. Notez que vous devrez spécifier les champs qui sont déjà présents dans une entité insertable=false, updatable=false
puisque vous ne pouvez pas avoir deux champs d'écriture capable avec le même nom dans une entité.