/*
* 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.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.Session;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Steve Ebersole
*/
public class DirtyCheckingTest extends BaseNonConfigCoreFunctionalTestCase {
@Test
public void dirtyCheckAgainstNewNameInstance() {
SomeEntity simpleEntity = new SomeEntity();
simpleEntity.setId( 1L );
simpleEntity.setName( new Name( "Steven" ) );
Session session = openSession();
session.getTransaction().begin();
session.save( simpleEntity );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
SomeEntity loaded = session.byId( SomeEntity.class ).load( 1L );
loaded.setName( new Name( "Steve" ) );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
loaded = session.byId( SomeEntity.class ).load( 1L );
assertEquals( "Steve", loaded.getName().getText() );
session.delete( loaded );
session.getTransaction().commit();
session.close();
}
@Test
public void dirtyCheckAgainstMutatedNameInstance() {
SomeEntity simpleEntity = new SomeEntity();
simpleEntity.setId( 1L );
simpleEntity.setName( new Name( "Steven" ) );
Session session = openSession();
session.getTransaction().begin();
session.save( simpleEntity );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
SomeEntity loaded = session.byId( SomeEntity.class ).load( 1L );
loaded.getName().setText( "Steve" );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
loaded = session.byId( SomeEntity.class ).load( 1L );
assertEquals( "Steve", loaded.getName().getText() );
session.delete( loaded );
session.getTransaction().commit();
session.close();
}
@Test
public void dirtyCheckAgainstNewNumberInstance() {
// numbers (and most other java types) are actually immutable...
SomeEntity simpleEntity = new SomeEntity();
simpleEntity.setId( 1L );
simpleEntity.setNumber( 1 );
Session session = openSession();
session.getTransaction().begin();
session.save( simpleEntity );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
SomeEntity loaded = session.byId( SomeEntity.class ).load( 1L );
loaded.setNumber( 2 );
session.getTransaction().commit();
session.close();
session = openSession();
session.getTransaction().begin();
loaded = session.byId( SomeEntity.class ).load( 1L );
assertEquals( 2, loaded.getNumber().intValue() );
session.delete( loaded );
session.getTransaction().commit();
session.close();
}
@Test
public void checkConverterMutabilityPlans() {
final EntityPersister persister = sessionFactory().getEntityPersister( SomeEntity.class.getName() );
assertFalse( persister.getPropertyType( "number" ).isMutable() );
assertTrue( persister.getPropertyType( "name" ).isMutable() );
}
@Override
protected Class[] getAnnotatedClasses() {
return new Class[] {SomeEntity.class};
}
public static class Name {
private String text;
public Name() {
}
public Name(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public static class NameConverter implements AttributeConverter<Name, String> {
public String convertToDatabaseColumn(Name name) {
return name == null ? null : name.getText();
}
public Name convertToEntityAttribute(String s) {
return s == null ? null : new Name( s );
}
}
public static class IntegerConverter implements AttributeConverter<Integer, String> {
public String convertToDatabaseColumn(Integer value) {
return value == null ? null : value.toString();
}
public Integer convertToEntityAttribute(String s) {
return s == null ? null : Integer.parseInt( s );
}
}
@Entity(name = "SomeEntity")
public static class SomeEntity {
@Id
private Long id;
@Convert(converter = IntegerConverter.class)
@Column(name = "num")
private Integer number;
@Convert(converter = NameConverter.class)
@Column(name = "name")
private Name name = new Name();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
}
}