I am using javax.persistence.OneToMany relationship in a Parent Child relationship. The parent Id is coming as null, I have read through all the related post in Stackoverflow but not getting any clue what I am missing. All the Corresponding PKs are getting populated in both Parent & Child tables as per the Sequence Provided, but the FK is set to null in Child table
Parent Class:
@Entity
@Table(name = "DIVERSITY_TEMPLATE")
public class DiversityTemplate implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ID", sequenceName = "DIVERSITY_TEMPLATE_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ID")
@Column(name = "DIVERSITY_TEMPLATE_ID")
private Integer diversityTemplateId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "diversityTemplate", fetch = FetchType.LAZY)
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
Child Class:
@Entity
@Table(name = "DIVERSITY_TEMPLATE_ATTRIBUTE")
@TypeName("DiversityTemplateAttribute")
public class DiversityTemplateAttribute implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ATTR_ID", sequenceName = "DIVERSITY_TEMPLATE_ATTR_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ATTR_ID")
@Column(name = "DIVERSITY_TEMPLATE_ATTR_ID")
private Integer diversityTemplateAttributeId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID", nullable=false, referencedColumnName = "DIVERSITY_TEMPLATE_ID")
private DiversityTemplate diversityTemplate;
Service Class:
diversityTemplateRepository.save(diversityTemplate);
Sample json
{
"diversityTemplateId": 0,
"attributes": [{
"diversityTemplateId": 0,
"diversityTemplateAttributeId": 0,
}, {
"diversityTemplateId": 0,
"diversityTemplateAttributeId": 0,
}]
}
Please suggest.
Usually empty FK columns are coming from setting only one side of the relation.
I imagine you have the following
DiversityTemplate diversityTemplate = ...
diversityTemplate.getAttributes().add(...)
...
diversityTemplateRepository.save(diversityTemplate);
This is wrong because the DiversityTemplateAttribute
doesn't know about the parent, only the parent know about his children.
Solving this is easy, you have to set the parent reference in the child.
diversityTemplateAttribute.setDiversityTemplate(diversityTemplate);
Or you can put this logic into a method within the DiversityTemplate
which automatically adds the attribute into the List + sets the backreference.
Parent Class:
@Entity
@Table(name = "DIVERSITY_TEMPLATE")
public class DiversityTemplate implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ID", sequenceName = "DIVERSITY_TEMPLATE_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ID")
@Column(name = "DIVERSITY_TEMPLATE_ID")
private Integer diversityTemplateId;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "DIVERSITY_TEMPLATE_ID")
private List<DiversityTemplateAttribute> attributes = new ArrayList<>();
Child Class:
@Entity
@Table(name = "DIVERSITY_TEMPLATE_ATTRIBUTE")
@TypeName("DiversityTemplateAttribute")
public class DiversityTemplateAttribute implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "DIVERSITY_TEMPLATE_ATTR_ID", sequenceName = "DIVERSITY_TEMPLATE_ATTR_ID", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DIVERSITY_TEMPLATE_ATTR_ID")
@Column(name = "DIVERSITY_TEMPLATE_ATTR_ID")
private Integer diversityTemplateAttributeId;
@ManyToOne(fetch = FetchType.LAZY)
private DiversityTemplate diversityTemplate;
Service Class:
diversityTemplateRepository.save(diversityTemplate);
This way you DON'T NEED TO DO PARENT ENTRY IN EACH CHILD. it will do by itself. you just need to save parent that's it.
Quick steps what I did.
- Removed mappedBy from Parent.
- Added @JoinCollumn foreign key in Parent
- Removed @JoinCollumn from Child.
Hope it helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With