/*
* 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.annotations.selectbeforeupdate;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Version;
import org.hibernate.annotations.SelectBeforeUpdate;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.hibernate.testing.transaction.TransactionUtil;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author Chris Cranford
*/
public class UpdateDetachedTest extends BaseCoreFunctionalTestCase{
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { Foo.class, Bar.class };
}
@Test
@TestForIssue(jiraKey = "HHH-5908")
public void testUpdateDetachedUnchanged() {
final Bar bar = new Bar( 1, "Bar" );
final Foo foo = new Foo( 1, "Foo", bar );
// this should generate versions
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.save( bar );
session.save( foo );
} );
// this shouldn't generate a new version.
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.update( foo );
} );
assertEquals( Integer.valueOf( 0 ), bar.getVersion() );
assertEquals( Integer.valueOf( 0 ), foo.getVersion() );
// this should generate a new version
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
foo.setName( "FooChanged" );
session.update( foo );
} );
assertEquals( Integer.valueOf( 0 ), bar.getVersion() );
assertEquals( Integer.valueOf( 1 ), foo.getVersion() );
}
@Test
@TestForIssue(jiraKey = "HHH-5908")
public void testUpdateDetachedChanged() {
final Bar bar = new Bar( 2, "Bar" );
final Foo foo = new Foo( 2, "Foo", bar );
// this should generate versions
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.save( bar );
session.save( foo );
} );
// this should generate a new version
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
foo.setName( "FooChanged" );
session.update( foo );
} );
assertEquals( Integer.valueOf( 0 ), bar.getVersion() );
assertEquals( Integer.valueOf( 1 ), foo.getVersion() );
}
@Test
@TestForIssue(jiraKey = "HHH-5908")
public void testUpdateDetachedUnchangedAndChanged() {
final Bar bar = new Bar( 3, "Bar" );
final Foo foo = new Foo( 3, "Foo", bar );
// this should generate versions
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.save( bar );
session.save( foo );
} );
// this shouldn't generate a new version.
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.update( foo );
} );
// this should generate a new version
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
foo.setName( "FooChanged" );
session.update( foo );
} );
assertEquals( Integer.valueOf( 0 ), bar.getVersion() );
assertEquals( Integer.valueOf( 1 ), foo.getVersion() );
}
@Test
@TestForIssue(jiraKey = "HHH-5908")
public void testUpdateDetachedChangedAndUnchanged() {
final Bar bar = new Bar( 4, "Bar" );
final Foo foo = new Foo( 4, "Foo", bar );
// this should generate versions
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.save( bar );
session.save( foo );
} );
// this should generate a new version
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
foo.setName( "FooChanged" );
session.update( foo );
} );
// this shouldn't generate a new version.
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
session.update( foo );
} );
assertEquals( Integer.valueOf( 0 ), bar.getVersion() );
assertEquals( Integer.valueOf( 1 ), foo.getVersion() );
}
@Entity(name = "Foo")
@SelectBeforeUpdate
public static class Foo {
@Id
private Integer id;
private String name;
@Version
private Integer version;
@ManyToOne
@JoinColumn(updatable = false)
private Bar bar;
Foo() {
}
Foo(Integer id, String name, Bar bar) {
this.id = id;
this.name = name;
this.bar = bar;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
}
@Entity(name = "Bar")
public static class Bar {
@Id
private Integer id;
private String name;
@Version
private Integer version;
Bar() {
}
Bar(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
}
}