diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java index 57cf8f448efbdd5d52250096e6bdae573ebdb063..2c2b0134845b3cf8fc63a66cf692ebc8794b95d9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java @@ -30,6 +30,7 @@ import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import javax.persistence.Transient; import javax.persistence.UniqueConstraint; import org.apache.commons.lang.builder.EqualsBuilder; @@ -113,19 +114,30 @@ public class AttachmentPE extends HibernateAbstractRegistrationHolder implements this.id = id; } - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @ManyToOne(fetch = FetchType.LAZY) @NotNull(message = ValidationMessages.EXPERIMENT_NOT_NULL_MESSAGE) @JoinColumn(name = ColumnNames.EXPERIMENT_COLUMN, updatable = false) - public ExperimentPE getParent() + private ExperimentPE getParentInternal() { return parent; } - public void setParent(final ExperimentPE parent) + void setParentInternal(final ExperimentPE parent) { this.parent = parent; } + @Transient + public ExperimentPE getParent() + { + return getParentInternal(); + } + + public void setParent(final ExperimentPE parent) + { + parent.addAttachment(this); + } + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @NotNull(message = ValidationMessages.ATTACHMENT_CONTENT_NOT_NULL_MESSAGE) @JoinColumn(name = ColumnNames.EXPERIMENT_ATTACHMENT_CONTENT_COLUMN, updatable = false) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java index 8c8c894c0547967e354049a9e88eaf09fec49042..195750604fe2e62b5ba00bb50beed9b7a8566a79 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java @@ -65,6 +65,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils; +import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; /** * Persistence Entity representing experiment. @@ -281,15 +282,18 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP getExperimentProperties().add(property); } - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parent") + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parentInternal") @IndexedEmbedded @Private + // for Hibernate and bean conversion only public Set<AttachmentPE> getExperimentAttachments() { return attachments; } + @SuppressWarnings("unused") @Private + // for Hibernate and bean conversion only public void setExperimentAttachments(final Set<AttachmentPE> attachments) { this.attachments = attachments; @@ -315,11 +319,29 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP // Package visibility to avoid bean conversion which will call an uninitialized field. final void setAttachments(final Set<AttachmentPE> attachments) { - for (final AttachmentPE experimentAttachment : attachments) + getExperimentAttachments().clear(); + for (final AttachmentPE attachment : attachments) + { + addAttachment(attachment); + } + } + + public void addAttachment(final AttachmentPE child) + { + final ExperimentPE parent = child.getParent(); + if (parent != null) + { + parent.getExperimentAttachments().remove(child); + } + child.setParentInternal(this); + // ensure that the collection is of the proper type - bean populator could set it to + // unmuttable empty list + if (getExperimentAttachments().size() == 0 + && getExperimentAttachments() instanceof HashSet == false) { - experimentAttachment.setParent(this); + setExperimentAttachments(new HashSet<AttachmentPE>()); } - setExperimentAttachments(attachments); + getExperimentAttachments().add(child); } @Transient @@ -503,4 +525,9 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP { return EntityKind.EXPERIMENT; } + + public void ensureAttachmentsLoaded() + { + HibernateUtils.initialize(getExperimentAttachments()); + } }