Skip to content
Snippets Groups Projects
Commit 3b192819 authored by jakubs's avatar jakubs
Browse files

SP-579 BIS-379 improve performance of fetching persons by making display

settings fetching lazy

SVN: 28752
parent 356ee982
No related branches found
No related tags found
No related merge requests found
......@@ -97,6 +97,13 @@ public final class PersonDAO extends AbstractGenericEntityDAO<PersonPE> implemen
final HibernateTemplate template = getHibernateTemplate();
template.save(person);
template.flush();
if (person.getPersonDisplaySettings() != null)
{
person.getPersonDisplaySettings().setId(person.getId());
template.update(person.getPersonDisplaySettings());
template.flush();
}
if (operationLog.isInfoEnabled())
{
operationLog.info(String.format("ADD: person '%s'.", person));
......@@ -110,6 +117,14 @@ public final class PersonDAO extends AbstractGenericEntityDAO<PersonPE> implemen
validatePE(person);
final HibernateTemplate template = getHibernateTemplate();
if (person.getPersonDisplaySettings() != null)
{
if (person.getPersonDisplaySettings().getId() == null)
{
person.getPersonDisplaySettings().setId(person.getId());
}
template.update(person.getPersonDisplaySettings());
}
template.merge(person); // WORKAROUND update cannot be used - see LMS-1603
template.flush();
if (operationLog.isInfoEnabled())
......
/*
* Copyright 2013 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.generic.shared.dto;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Type;
import ch.systemsx.cisd.openbis.generic.shared.IServer;
import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
import ch.systemsx.cisd.openbis.generic.shared.util.DisplaySettingsSerializationUtils;
/**
* @author Jakub Straszewski
*/
@Entity
@Table(name = TableNames.PERSONS_TABLE)
public final class PersonDisplaySettingsPE implements IIdHolder, Serializable
{
private static final long serialVersionUID = IServer.VERSION;
private transient Long id;
private DisplaySettings displaySettings;
private byte[] serializedDisplaySettings;
//
// IIdHolder
//
@Override
@Id
public final Long getId()
{
return id;
}
public final void setId(final Long id)
{
this.id = id;
}
@Transient
public DisplaySettings getDisplaySettings()
{
if (displaySettings == null)
{
byte[] serializedSettings = getSerializedDisplaySettings();
displaySettings =
DisplaySettingsSerializationUtils
.deserializeOrCreateDisplaySettings(serializedSettings);
}
return displaySettings;
}
public void setDisplaySettings(DisplaySettings displaySettings)
{
this.displaySettings = displaySettings;
setSerializedDisplaySettings(DisplaySettingsSerializationUtils
.serializeDisplaySettings(displaySettings));
}
@Transient
public int getDisplaySettingsSize()
{
return serializedDisplaySettings == null ? 0 : serializedDisplaySettings.length;
}
@Column(name = ColumnNames.PERSON_DISPLAY_SETTINGS, updatable = true)
@Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] getSerializedDisplaySettings()
{
return serializedDisplaySettings;
}
private void setSerializedDisplaySettings(final byte[] value)
{
this.serializedDisplaySettings = value;
}
}
......@@ -31,6 +31,7 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
......@@ -41,7 +42,6 @@ import javax.validation.constraints.Pattern;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Store;
......@@ -55,7 +55,6 @@ import ch.systemsx.cisd.openbis.generic.shared.IServer;
import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
import ch.systemsx.cisd.openbis.generic.shared.util.DisplaySettingsSerializationUtils;
/**
* A <i>Persistence Entity</i> which represents a person.
......@@ -100,12 +99,10 @@ public final class PersonPE extends HibernateAbstractRegistrationHolder implemen
private Set<AuthorizationGroupPE> authorizationGroups = new HashSet<AuthorizationGroupPE>();
private DisplaySettings displaySettings;
private byte[] serializedDisplaySettings;
private boolean active;
private PersonDisplaySettingsPE personDisplaySettings;
private final void setSystemUser(final boolean systemUser)
{
this.systemUser = systemUser;
......@@ -190,6 +187,37 @@ public final class PersonPE extends HibernateAbstractRegistrationHolder implemen
this.databaseInstance = databaseInstance;
}
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = ColumnNames.ID_COLUMN, nullable = true)
public final PersonDisplaySettingsPE getPersonDisplaySettings()
{
return this.personDisplaySettings;
}
public final void setPersonDisplaySettings(PersonDisplaySettingsPE personDisplaySettings)
{
this.personDisplaySettings = personDisplaySettings;
}
@Transient
public DisplaySettings getDisplaySettings()
{
if (getPersonDisplaySettings() == null)
{
setPersonDisplaySettings(new PersonDisplaySettingsPE());
}
return getPersonDisplaySettings().getDisplaySettings();
}
public void setDisplaySettings(DisplaySettings displaySettings)
{
if (getPersonDisplaySettings() == null)
{
setPersonDisplaySettings(new PersonDisplaySettingsPE());
}
getPersonDisplaySettings().setDisplaySettings(displaySettings);
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = ColumnNames.SPACE_COLUMN)
public final SpacePE getHomeSpace()
......@@ -277,38 +305,6 @@ public final class PersonPE extends HibernateAbstractRegistrationHolder implemen
return new UnmodifiableSetDecorator<AuthorizationGroupPE>(getAuthorizationGroupsInternal());
}
@Transient
public DisplaySettings getDisplaySettings()
{
if (displaySettings == null)
{
byte[] serializedSettings = getSerializedDisplaySettings();
displaySettings =
DisplaySettingsSerializationUtils
.deserializeOrCreateDisplaySettings(serializedSettings);
}
return displaySettings;
}
public void setDisplaySettings(DisplaySettings displaySettings)
{
this.displaySettings = displaySettings;
setSerializedDisplaySettings(DisplaySettingsSerializationUtils
.serializeDisplaySettings(displaySettings));
}
@Column(name = ColumnNames.PERSON_DISPLAY_SETTINGS, updatable = true)
@Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] getSerializedDisplaySettings()
{
return serializedDisplaySettings;
}
private void setSerializedDisplaySettings(final byte[] value)
{
this.serializedDisplaySettings = value;
}
@Column(name = ColumnNames.PERSON_IS_ACTIVE_COLUMN)
public boolean isActive()
{
......@@ -374,9 +370,10 @@ public final class PersonPE extends HibernateAbstractRegistrationHolder implemen
builder.append("lastName", lastName);
builder.append("email", email);
builder.append("systemUser", systemUser);
if (serializedDisplaySettings != null)
if (getPersonDisplaySettings() != null)
{
builder.append("displaySettings", "<" + serializedDisplaySettings.length + " bytes>");
builder.append("displaySettings", "<"
+ getPersonDisplaySettings().getDisplaySettingsSize() + " bytes>");
}
builder.append(getDatabaseInstance());
return builder.toString();
......
......@@ -103,6 +103,8 @@
<value>ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE</value>
<value>ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE</value>
<value>ch.systemsx.cisd.openbis.generic.shared.dto.PersonDisplaySettingsPE</value>
</list>
</property>
<!--
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment