J'ai une table parent, c'est-à-dire audit_log (parent) qui contient un seul identifiant de colonne. Pour un identifiant donné dans audit_log, j'ai une liste d'identifiants de fournisseurs. Je les stocke dans une table séparée audit_log_vendorid (table enfant). Je veux que la table enfant obtienne l'ID de la table parent comme l'une des colonnes (parent_id). Voici le schéma de la table.Hibernate JPA Mappage parent-enfant
audit_log
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | bigint(19) | NO | PRI | NULL | |
+-------+------------+------+-----+---------+-------+
audit_log_vendorid
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | bigint(19) | NO | PRI | NULL | auto_increment |
| vendor_id | bigint(19) | NO | | NULL | |
| parent_id | bigint(19) | NO | | NULL | |
+-----------+------------+------+-----+---------+----------------+
I'have défini mes cours de mise en veille prolongée comme suit
@Entity
@Table(name="audit_log")
public class AuditLog {
private List<AuditVendorPair> vendorIDs;
public AuditLog(List<AuditVendorPair> vendorIds) throws Exception {
this.vendorIDs = vendorIDs;
}
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name = "audit_log_vendorid",
joinColumns = { @JoinColumn(name = "parent_id", referencedColumnName="id") })
public List<AuditVendorPair> getVendors() {
return vendorIDs;
}
@Id @Column(name="ID")
public Long getId() {
return super.getId();
}
public void setHostServices(List<AuditVendorPair> vendorIDs){
this.vendorIDs = vendorIDs;
}
}
Ma classe de cartographie mise en veille prolongée pour audit_log_vendorid est ci-dessous. Je passe un identificateur de fournisseur et j'attends que les deux autres champs soient remplis par hibernate. Le champ parent_id que je veux du champ "id" dans audit_log. Il est initialisé comme nul à partir de maintenant provoquant une exception de contrainte mysql.
@Entity
@Table(name="audit_log_vendorid")
public class AuditVendorPair {
private Long id;
private Long parent_id;
private Long vendor_id;
public AuditVendorPair(Long vendor_id){
this.vendor_id = vendor_id;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
@Column(name="vendor_id")
public Long getVendorID() {
return vendor_id;
}
public void setVendorID(Long vendor_id){
this.vendor_id = vendor_id;
}
@Column(name="parent_id")
public Long getParentId() {
return parent_id;
}
public void setParentId(Long parentID){
this.parent_id = parentID;
}
}
Je suis curieux de savoir si mes annotations sont correctes. Je veux essentiellement que l'id de la table audit_log soit rempli dans le champ parent_id de la table audit_log_vendorid par hibernate.
Oui audit_log_vendorid n'est pas une table de jointure. Quelle est la raison de se référer à AuditLog, mappé avec ManyToOne? Je pensais que oneToMany unidirectionnel fonctionnerait. A l'aide de la clé étrangère, indiquons-nous d'hiberner qu'il doit extraire la valeur de parent_id à partir de la colonne référencée? Est-ce que les choses vont changer si ma clé primaire dans la table audit_log est plus que l'identifiant? – skeptic01
Vous pouvez utiliser OneToMany unidirectionnel, mais la colonne parent_id dans audit_log_vendorid sera gérée par l'association OneToMany (vous aurez besoin de '@JoinColumn (" parent_id ")'), et ne doit pas être mappée une seconde fois dans l'entité AuditVendorPair. Si vous devez accéder au parent à partir de l'entité AuditVendorPair, il doit être bidirectionnel. –