jpa hibernate composite foreign key mapping
This is governed by JPA 2 spec section 2.4.1, "Primary Keys Corresponding to Derived Identities". The section contains two examples directly applicable to your problem.
As described in the spec, there are two ways to represent the child entity's key in this case:
@IdClass
@EmbeddedId
Here's a rough sketch of the EmbeddedId
way. I chose EmbeddedId
arbitrarily, but the choice between IdClass
and EmbeddedId
is significant. You might choose differently.
// Child entity's composite primary key
@Embeddable
public class InstanceNotifyEntityId implements Serializable {
Long eaihId;
Long userId;
}
// Child entity
@Entity
@Table(name="EIF_INST_NOTIFIED")
public class InstanceNotifyEntity implements Serializable {
@AttributeOverrides({
@AttributeOverride(name="userId", column = @Column(name="USER_ID"))
@AttributeOverride(name="eaihId", column = @Column(name="EAIH_ID"))
})
@EmbeddedId
InstanceNotifyEntityId id;
@MapsId("eaihId")
@ManyToOne
InstanceEntity instance;
// ...
}
The parent entity needs one change: the userDetails
attribute mappedBy
should be "id.eaihId". I think that's it, but I haven't used entities exactly like this before. Might have missed something... please post if you see errors.
I was also facing the same issue and followed this answer but it is not saving the child entity with parent entity. Here is the changes which I made and it is working fine. Make below changes -
// Child entity's composite primary key class
public class InstanceNotifyEntityId implements Serializable {
@Column(name = "USER_ID")
Long userId;
@JoinColumn(name = "EAIH_ID")
@ManyToOne
InstanceEntity instance
}
// Child entity which contain composite primary key as a EmbeddedId,
// no need to define any relationship here as we already define
// the relationship in composite key class.
@Entity
@Table(name = "EIF_INST_NOTIFIED")
public class InstanceNotifyEntity implements Serializable {
@EmbeddedId
InstanceNotifyEntityId id;
}
// Parent entity (parent entity mappedby should be your composite
// key class instance.child class object which already have the
// join column mapping with "EAID_ID")
@Entity
@Table(name = "EIF_INSTANCE_HDR")
public class InstanceEntity implements Serializable {
@OneToMany(mappedBy = "id.instance,fetch=FetchType.EAGER, cascade = CascadeType.ALL)
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>();
}
While saving the parent entity set the parent object into the composite key like id.setInstance(parent entire obj)