diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
index 5e8a2400139581dec0ae19820dbd0545888f5ad5..38c2d1a2822d39c34d9dca5810cf7ddc2dfc3109 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -43,10 +44,6 @@ import javax.persistence.Version;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
-import ch.systemsx.cisd.openbis.generic.server.CommonServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -65,6 +62,9 @@ import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
@@ -129,29 +129,32 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
 
     private String permId;
 
-    private Set<SampleRelationshipPE> parentRelationships;
+    private Set<SampleRelationshipPE> parentRelationships = new LinkedHashSet<SampleRelationshipPE>();
 
-    private Set<SampleRelationshipPE> childRelationships;
+    private Set<SampleRelationshipPE> childRelationships = new LinkedHashSet<SampleRelationshipPE>();
 
     private Set<MetaprojectAssignmentPE> metaprojectAssignments =
             new HashSet<MetaprojectAssignmentPE>();
 
-    @Transient
+    @OptimisticLock(excluded = true)
+    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentSample")
+    @Fetch(FetchMode.SUBSELECT)
     private Set<SampleRelationshipPE> getSampleChildRelationships()
     {
-        if (childRelationships == null) {
-            if (id == null) {
-                childRelationships = new HashSet<>();
-            } else {
-                childRelationships = new HashSet<>(CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().listSampleChildren(List.of(id)));
-            }
-        }
         return childRelationships;
     }
 
+    // Required by Hibernate.
+    @SuppressWarnings("unused")
+    private void setSampleChildRelationships(final Set<SampleRelationshipPE> childRelationships)
+    {
+        this.childRelationships = childRelationships;
+    }
+
     @Transient
     public Set<SampleRelationshipPE> getChildRelationships()
     {
+
         return new UnmodifiableSetDecorator<SampleRelationshipPE>(getSampleChildRelationships());
     }
 
@@ -168,22 +171,23 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
     {
         relationship.setParentSample(this);
         getSampleChildRelationships().add(relationship);
-        CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().persist(List.of(relationship));
     }
 
-    @Transient
+    @OptimisticLock(excluded = true)
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "childSample", orphanRemoval = true)
+    @Fetch(FetchMode.SUBSELECT)
     private Set<SampleRelationshipPE> getSampleParentRelationships()
     {
-        if (parentRelationships == null) {
-            if (id == null) {
-                parentRelationships = new HashSet<>();
-            } else {
-                parentRelationships = new HashSet<>(CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().listSampleParents(List.of(id)));
-            }
-        }
         return parentRelationships;
     }
 
+    // Required by Hibernate.
+    @SuppressWarnings("unused")
+    private void setSampleParentRelationships(final Set<SampleRelationshipPE> parentRelationships)
+    {
+        this.parentRelationships = parentRelationships;
+    }
+
     @Transient
     public Set<SampleRelationshipPE> getParentRelationships()
     {
@@ -201,7 +205,6 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
 
     public void setParentRelationships(final Set<SampleRelationshipPE> parentRelationships)
     {
-        CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().delete(getSampleParentRelationships());
         getSampleParentRelationships().clear();
         for (final SampleRelationshipPE sampleRelationship : parentRelationships)
         {
@@ -218,7 +221,6 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
     {
         relationship.setChildSample(this);
         getSampleParentRelationships().add(relationship);
-        CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().persist(List.of(relationship));
     }
 
     public void removeParentRelationship(final SampleRelationshipPE relationship)
@@ -227,7 +229,6 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
         relationship.getParentSample().getSampleChildRelationships().remove(relationship);
         relationship.setChildSample(null);
         relationship.setParentSample(null);
-        CommonServiceProvider.getDAOFactory().getSampleRelationshipDAO().delete(List.of(relationship));
     }
 
     /**