É o seguinte pessoal estou com um problema de mapeamento usando JPA.
Estou usando o spring como framework.
Quando chamo o save na minha controller para inserir uma Activity e ActivityFile, funciona tranquilamente. Mas quando depois de inserir vou atualizar qualquer informação do pai ou do filho, como adicionar mais um arquivo, la no banco eu vejo que a FK de activity_file (id_activity) fica nula logo depois da atualização, e aí se perde a referência.
Saquem como estão minhas classes.
Obs: Uma atividade pode ter vários arquivos (ActivityFile)
Activity
@Entity
@SequenceGenerator(initialValue = 1, name = "base_gen", sequenceName = "activity_seq")
@Table(name = "activity")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "id_activity")) })
public class Activity extends GenericEntity {
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name = "nm_activity", nullable = false, length = 1000)
private String name;
@Enumerated(EnumType.STRING)
@Column(name = "tp_status", nullable = false, length = 50)
private ActivityStatusEnum status;
@Column(name = "dt_activity")
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate dateActivity;
@Column(name = "ck_active")
@Type(type = "org.hibernate.type.NumericBooleanType")
private boolean active = true;
@Column(name = "nr_occurrence", nullable = true)
private Integer numberOccurrence;
@Column(name = "nr_occurrence_accounted", nullable = true)
private Integer numberOccurrenceAccounted;
@Column(name = "nr_occurrence_glosa", nullable = true)
private Integer numberOccurrenceGlosa;
@Column(name = "nr_hour", nullable = true)
private Integer numberHour;
@Column(name = "nr_hour_accounted", nullable = true)
private Integer numberHourAccounted;
@Column(name = "nr_hour_glosa", nullable = true)
private Integer numberHourGlosa;
@Enumerated(EnumType.STRING)
@Column(name = "tp_appropiation", nullable = true)
private ActivityAppropiationEnum typeAppropiation;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_user", nullable = false)
private User student;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_activity_type", nullable = false)
private ActivityType activityType;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = false, fetch = FetchType.LAZY)
@JoinColumn(name = "id_activity")
@LazyCollection(LazyCollectionOption.FALSE)
@JsonSerialize(using = ActivityFileListSerializer.class)
private List<ActivityFile> activityFiles;
public Activity() { }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ActivityStatusEnum getStatus() {
return status;
}
public void setStatus(ActivityStatusEnum status) {
this.status = status;
}
public LocalDate getDateActivity() {
return dateActivity;
}
public void setDateActivity(LocalDate dateActivity) {
this.dateActivity = dateActivity;
}
public Integer getNumberOccurrence() {
return numberOccurrence;
}
public void setNumberOccurrence(Integer numberOccurrence) {
this.numberOccurrence = numberOccurrence;
}
public Integer getNumberOccurrenceAccounted() {
return numberOccurrenceAccounted;
}
public void setNumberOccurrenceAccounted(Integer numberOccurrenceAccounted) {
this.numberOccurrenceAccounted = numberOccurrenceAccounted;
}
public Integer getNumberHour() {
return numberHour;
}
public void setNumberHour(Integer numberHour) {
this.numberHour = numberHour;
}
public Integer getNumberHourAccounted() {
return numberHourAccounted;
}
public void setNumberHourAccounted(Integer numberHourAccounted) {
this.numberHourAccounted = numberHourAccounted;
}
public ActivityAppropiationEnum getTypeAppropiation() {
return typeAppropiation;
}
public void setTypeAppropiation(ActivityAppropiationEnum typeAppropiation) {
this.typeAppropiation = typeAppropiation;
}
public User getStudent() {
return student;
}
public void setStudent(User student) {
this.student = student;
}
public ActivityType getActivityType() {
return activityType;
}
public void setActivityType(ActivityType activityType) {
this.activityType = activityType;
}
public Integer getNumberOccurrenceGlosa() {
return numberOccurrenceGlosa;
}
public void setNumberOccurrenceGlosa(Integer numberOccurrenceGlosa) {
this.numberOccurrenceGlosa = numberOccurrenceGlosa;
}
public Integer getNumberHourGlosa() {
return numberHourGlosa;
}
public void setNumberHourGlosa(Integer numberHourGlosa) {
this.numberHourGlosa = numberHourGlosa;
}
public List<ActivityFile> getActivityFiles() {
return activityFiles;
}
public void setActivityFiles(List<ActivityFile> activityFiles) {
this.activityFiles = activityFiles;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
ActivityFile
@Entity
@SequenceGenerator(initialValue = 1, name = "base_gen", sequenceName = "activity_file_seq")
@Table(name = "activity_file")
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "id_activity_file")) })
public class ActivityFile extends GenericEntity {
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name = "nm_file", nullable = false, length = 200)
private String name;
@Column(name = "tp_file", nullable = false, length = 200)
private String type;
@Enumerated(EnumType.STRING)
@Column(name = "nm_status", nullable = true)
private ActivityStatusFile status;
@Lob
@Column(name = "byte_file", nullable = false, length = 2000)
private byte[] file;
@Column(name = "nr_size", nullable = false)
private double size;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "id_activity")
private Activity activity;
public ActivityFile() {
}
public void setSize(double size) {
this.size = size;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ActivityStatusFile getStatus() {
return status;
}
public void setStatus(ActivityStatusFile status) {
this.status = status;
}
public byte[] getFile() {
return file;
}
public void setFile(byte[] file) {
this.file = file;
}
public double getSize() {
return size;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
Brigadão desde já…