/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.bytecode.enhancement.merge;
import java.util.Arrays;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.test.bytecode.enhancement.AbstractEnhancerTestTask;
import org.hibernate.testing.bytecode.enhancement.EnhancerTestUtils;
import org.junit.Assert;
/**
* @author Luis Barreiro
*/
public class CompositeMergeTestTask extends AbstractEnhancerTestTask {
private long entityId;
public Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {ParentEntity.class, Address.class, Country.class};
}
public void prepare() {
Configuration cfg = new Configuration();
cfg.setProperty( Environment.ENABLE_LAZY_LOAD_NO_TRANS, "true" );
cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false" );
super.prepare( cfg );
ParentEntity parent = new ParentEntity();
parent.description = "desc";
parent.address = new Address();
parent.address.street = "Sesame street";
parent.address.country = new Country();
parent.address.country.name = "Suriname";
parent.address.country.languages = Arrays.asList( "english", "spanish" );
parent.lazyField = new byte[100];
Session s = getFactory().openSession();
s.beginTransaction();
s.persist( parent );
s.getTransaction().commit();
s.close();
EnhancerTestUtils.checkDirtyTracking( parent );
entityId = parent.id;
}
public void execute() {
Session s = getFactory().openSession();
s.beginTransaction();
ParentEntity parent = s.get( ParentEntity.class, entityId );
s.getTransaction().commit();
s.close();
EnhancerTestUtils.checkDirtyTracking( parent );
parent.address.country.name = "Paraguai";
EnhancerTestUtils.checkDirtyTracking( parent, "address.country" );
s = getFactory().openSession();
s.beginTransaction();
ParentEntity mergedParent = (ParentEntity) s.merge( parent );
EnhancerTestUtils.checkDirtyTracking( parent, "address.country" );
EnhancerTestUtils.checkDirtyTracking( mergedParent, "address.country" );
s.getTransaction().commit();
s.close();
EnhancerTestUtils.checkDirtyTracking( parent, "address.country" );
EnhancerTestUtils.checkDirtyTracking( mergedParent );
mergedParent.address.country.name = "Honduras";
EnhancerTestUtils.checkDirtyTracking( mergedParent, "address.country" );
s = getFactory().openSession();
s.beginTransaction();
s.saveOrUpdate( mergedParent );
EnhancerTestUtils.checkDirtyTracking( mergedParent, "address.country" );
s.getTransaction().commit();
s.close();
s = getFactory().openSession();
s.beginTransaction();
parent = s.get( ParentEntity.class, entityId );
s.getTransaction().commit();
s.close();
Assert.assertEquals( "Honduras", parent.address.country.name );
}
protected void cleanup() {
}
@Entity
@Table(name = "parent_entity")
private static class ParentEntity {
@Id
@GeneratedValue
private long id;
private String description;
@Embedded
private Address address;
@Basic(fetch = FetchType.LAZY)
private byte[] lazyField;
}
@Embeddable
@Table(name = "address")
private static class Address {
private String street;
@Embedded
private Country country;
}
@Embeddable
@Table(name = "country")
private static class Country {
private String name;
@ElementCollection
@CollectionTable(name = "languages", joinColumns = @JoinColumn(name = "id", referencedColumnName = "id"))
List<String> languages;
}
}