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 Stackoverflo
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.
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.