Fix o.h.Interceptor#onSave call
This commit is contained in:
parent
55db51894f
commit
df0479951c
|
@ -9,6 +9,7 @@ package org.hibernate;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.metamodel.RepresentationMode;
|
import org.hibernate.metamodel.RepresentationMode;
|
||||||
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An interceptor that does nothing. May be used as a base class for application-defined custom interceptors.
|
* An interceptor that does nothing. May be used as a base class for application-defined custom interceptors.
|
||||||
|
@ -26,6 +27,12 @@ public class EmptyInterceptor implements Interceptor, Serializable {
|
||||||
|
|
||||||
protected EmptyInterceptor() {}
|
protected EmptyInterceptor() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
|
throws CallbackException {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object instantiate(String entityName, RepresentationMode representationMode, Object id) throws CallbackException {
|
public Object instantiate(String entityName, RepresentationMode representationMode, Object id) throws CallbackException {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -168,36 +168,9 @@ public interface Interceptor {
|
||||||
* @return <tt>true</tt> if the user modified the <tt>state</tt> in any way.
|
* @return <tt>true</tt> if the user modified the <tt>state</tt> in any way.
|
||||||
*
|
*
|
||||||
* @throws CallbackException Thrown if the interceptor encounters any problems handling the callback.
|
* @throws CallbackException Thrown if the interceptor encounters any problems handling the callback.
|
||||||
*
|
|
||||||
* @deprecated use {@link #onSave(Object, Object, Object[], String[], Type[])}
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
default boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
throws CallbackException;
|
||||||
throws CallbackException {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called before an object is saved. The interceptor may modify the <tt>state</tt>, which will be used for
|
|
||||||
* the SQL <tt>INSERT</tt> and propagated to the persistent object.
|
|
||||||
*
|
|
||||||
* @param entity The entity instance whose state is being inserted
|
|
||||||
* @param id The identifier of the entity
|
|
||||||
* @param state The state of the entity which will be inserted
|
|
||||||
* @param propertyNames The names of the entity properties.
|
|
||||||
* @param types The types of the entity properties
|
|
||||||
*
|
|
||||||
* @return <tt>true</tt> if the user modified the <tt>state</tt> in any way.
|
|
||||||
*
|
|
||||||
* @throws CallbackException Thrown if the interceptor encounters any problems handling the callback.
|
|
||||||
*/
|
|
||||||
default boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
|
||||||
throws CallbackException {
|
|
||||||
if (id instanceof Serializable) {
|
|
||||||
return onSave(entity, (Serializable) id, state, propertyNames, types);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called before an object is deleted. It is not recommended that the interceptor modify the <tt>state</tt>.
|
* Called before an object is deleted. It is not recommended that the interceptor modify the <tt>state</tt>.
|
||||||
|
|
|
@ -4,24 +4,26 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.component.empty;
|
package org.hibernate.orm.test.component.empty;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import jakarta.persistence.Embeddable;
|
import jakarta.persistence.Embeddable;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import org.hibernate.cfg.Configuration;
|
|
||||||
import org.hibernate.cfg.Environment;
|
|
||||||
import org.hibernate.orm.test.component.empty.ComponentEmptyEmbedded;
|
|
||||||
|
|
||||||
import org.hibernate.testing.FailureExpected;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that an empty embeddable that is nested inside an embeddable is initialized.
|
* Tests that an empty embeddable that is nested inside an embeddable is initialized.
|
||||||
|
@ -29,47 +31,46 @@ import static org.junit.Assert.assertNotNull;
|
||||||
* @author Gail Badner
|
* @author Gail Badner
|
||||||
*/
|
*/
|
||||||
@TestForIssue(jiraKey = "HHH-11926")
|
@TestForIssue(jiraKey = "HHH-11926")
|
||||||
public class EmptyInitializedNestedCompositesTest extends BaseCoreFunctionalTestCase {
|
@DomainModel(
|
||||||
|
annotatedClasses = EmptyInitializedNestedCompositesTest.ComponentEmptyNestedEmbeddedOwner.class
|
||||||
@Override
|
)
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
@SessionFactory
|
||||||
return new Class[] { ComponentEmptyNestedEmbeddedOwner.class };
|
@ServiceRegistry(
|
||||||
}
|
settings = @Setting(name = Environment.CREATE_EMPTY_COMPOSITES_ENABLED, value = "true")
|
||||||
|
)
|
||||||
@Override
|
public class EmptyInitializedNestedCompositesTest {
|
||||||
protected void configure(Configuration configuration) {
|
|
||||||
super.configure( configuration );
|
|
||||||
configuration.getProperties().put( Environment.CREATE_EMPTY_COMPOSITES_ENABLED, Boolean.valueOf( true ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test empty nested composite initialization.
|
* Test empty nested composite initialization.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
@FailureExpected( jiraKey = "HHH-11926" )
|
public void testCompositesEmpty(SessionFactoryScope scope) {
|
||||||
public void testCompositesEmpty() {
|
|
||||||
Session s = openSession();
|
scope.inSession(
|
||||||
|
session -> {
|
||||||
|
session.beginTransaction();
|
||||||
try {
|
try {
|
||||||
s.getTransaction().begin();
|
|
||||||
|
|
||||||
ComponentEmptyNestedEmbeddedOwner owner = new ComponentEmptyNestedEmbeddedOwner();
|
ComponentEmptyNestedEmbeddedOwner owner = new ComponentEmptyNestedEmbeddedOwner();
|
||||||
s.persist( owner );
|
session.persist( owner );
|
||||||
|
|
||||||
s.flush();
|
session.flush();
|
||||||
s.getTransaction().commit();
|
session.getTransaction().commit();
|
||||||
|
|
||||||
s.clear();
|
session.clear();
|
||||||
s.getTransaction().begin();
|
session.getTransaction().begin();
|
||||||
owner = s.get( ComponentEmptyNestedEmbeddedOwner.class, owner.getId() );
|
owner = session.get( ComponentEmptyNestedEmbeddedOwner.class, owner.getId() );
|
||||||
assertNotNull( owner.getEmbedded() );
|
assertNotNull( owner.getEmbedded() );
|
||||||
assertNotNull( owner.getEmbedded().getNestedEmbedded() );
|
assertNotNull( owner.getEmbedded().getNestedEmbedded() );
|
||||||
|
session.getTransaction().commit();
|
||||||
s.getTransaction().rollback();
|
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
s.close();
|
if ( session.getTransaction().isActive() ) {
|
||||||
|
session.getTransaction().rollback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Entity(name = "EmptyNestedOwner")
|
@Entity(name = "EmptyNestedOwner")
|
||||||
public static class ComponentEmptyNestedEmbeddedOwner {
|
public static class ComponentEmptyNestedEmbeddedOwner {
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: CollectionInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
//$Id: CollectionInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.EmptyInterceptor;
|
import org.hibernate.EmptyInterceptor;
|
||||||
|
@ -19,7 +19,7 @@ public class CollectionInterceptor extends EmptyInterceptor {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) {
|
||||||
( (User) entity ).getActions().add("created");
|
( (User) entity ).getActions().add("created");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
|
@ -9,7 +9,7 @@
|
||||||
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
|
||||||
|
|
||||||
<hibernate-mapping package="org.hibernate.test.interceptor">
|
<hibernate-mapping package="org.hibernate.orm.test.interceptor">
|
||||||
|
|
||||||
<class name="Image" table="image" abstract="false" select-before-update="true" >
|
<class name="Image" table="image" abstract="false" select-before-update="true" >
|
||||||
<id name="id" type="java.lang.Long" column="id">
|
<id name="id" type="java.lang.Long" column="id">
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
|
|
||||||
|
|
||||||
public class Image {
|
public class Image {
|
|
@ -8,7 +8,7 @@
|
||||||
/**
|
/**
|
||||||
* @author Gail Badner
|
* @author Gail Badner
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
|
|
||||||
import org.hibernate.CallbackException;
|
import org.hibernate.CallbackException;
|
||||||
import org.hibernate.EmptyInterceptor;
|
import org.hibernate.EmptyInterceptor;
|
||||||
|
@ -23,7 +23,7 @@ public class InstantiateInterceptor extends EmptyInterceptor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object instantiate(String entityName, RepresentationMode entityMode, Object id) throws CallbackException {
|
public Object instantiate(String entityName, RepresentationMode entityMode, Object id) throws CallbackException {
|
||||||
if ( ! "org.hibernate.test.interceptor.User".equals( entityName ) ) {
|
if ( ! "org.hibernate.orm.test.interceptor.User".equals( entityName ) ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// Simply inject a sample string into new instances
|
// Simply inject a sample string into new instances
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
|
@ -4,10 +4,12 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
|
|
||||||
import jakarta.persistence.PersistenceException;
|
import jakarta.persistence.PersistenceException;
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -22,8 +24,10 @@ import org.hibernate.Interceptor;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.TransactionException;
|
import org.hibernate.TransactionException;
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
|
||||||
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
||||||
|
@ -44,6 +48,11 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
return new String[] { "interceptor/User.hbm.xml", "interceptor/Image.hbm.xml" };
|
return new String[] { "interceptor/User.hbm.xml", "interceptor/Image.hbm.xml" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getBaseForMappings() {
|
||||||
|
return "org/hibernate/orm/test/";
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCollectionIntercept() {
|
public void testCollectionIntercept() {
|
||||||
Session s = openSession( new CollectionInterceptor() );
|
Session s = openSession( new CollectionInterceptor() );
|
||||||
|
@ -56,7 +65,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
s = openSession();
|
s = openSession();
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
u = (User) s.get(User.class, "Gavin");
|
u = s.get( User.class, "Gavin" );
|
||||||
assertEquals( 2, u.getActions().size() );
|
assertEquals( 2, u.getActions().size() );
|
||||||
s.delete( u );
|
s.delete( u );
|
||||||
t.commit();
|
t.commit();
|
||||||
|
@ -75,7 +84,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
s = openSession();
|
s = openSession();
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
u = (User) s.get(User.class, "Gavin");
|
u = s.get( User.class, "Gavin" );
|
||||||
assertNotNull( u.getCreated() );
|
assertNotNull( u.getCreated() );
|
||||||
assertNotNull( u.getLastUpdated() );
|
assertNotNull( u.getLastUpdated() );
|
||||||
s.delete( u );
|
s.delete( u );
|
||||||
|
@ -100,21 +109,33 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
s = openSession(
|
s = openSession(
|
||||||
new EmptyInterceptor() {
|
new EmptyInterceptor() {
|
||||||
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
@Override
|
||||||
currentState[0] = "test";
|
public boolean onFlushDirty(
|
||||||
|
Object entity,
|
||||||
|
Serializable id,
|
||||||
|
Object[] currentState,
|
||||||
|
Object[] previousState,
|
||||||
|
String[] propertyNames,
|
||||||
|
Type[] types) {
|
||||||
|
for ( int i = 0; i < propertyNames.length; i++ ) {
|
||||||
|
if ( propertyNames[i].equals( "password" ) ) {
|
||||||
|
currentState[i] = "test";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
u = ( User ) s.get( User.class, u.getName() );
|
u = s.get( User.class, u.getName() );
|
||||||
u.setPassword( "nottest" );
|
u.setPassword( "nottest" );
|
||||||
t.commit();
|
t.commit();
|
||||||
s.close();
|
s.close();
|
||||||
|
|
||||||
s = openSession();
|
s = openSession();
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
u = (User) s.get(User.class, "Josh");
|
u = s.get( User.class, "Josh" );
|
||||||
assertEquals( "test", u.getPassword() );
|
assertEquals( "test", u.getPassword() );
|
||||||
s.delete( u );
|
s.delete( u );
|
||||||
t.commit();
|
t.commit();
|
||||||
|
@ -160,7 +181,13 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
Session s = openSession(
|
Session s = openSession(
|
||||||
new EmptyInterceptor() {
|
new EmptyInterceptor() {
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
|
@Override
|
||||||
|
public boolean onSave(
|
||||||
|
Object entity,
|
||||||
|
Object id,
|
||||||
|
Object[] state,
|
||||||
|
String[] propertyNames,
|
||||||
|
Type[] types) {
|
||||||
if ( state[0] == null ) {
|
if ( state[0] == null ) {
|
||||||
Image.Details detail = new Image.Details();
|
Image.Details detail = new Image.Details();
|
||||||
detail.setPerm1( checkPerm );
|
detail.setPerm1( checkPerm );
|
||||||
|
@ -183,7 +210,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
s = openSession();
|
s = openSession();
|
||||||
s.beginTransaction();
|
s.beginTransaction();
|
||||||
i = ( Image ) s.get( Image.class, i.getId() );
|
i = s.get( Image.class, i.getId() );
|
||||||
assertNotNull( i.getDetails() );
|
assertNotNull( i.getDetails() );
|
||||||
assertEquals( checkPerm, i.getDetails().getPerm1() );
|
assertEquals( checkPerm, i.getDetails().getPerm1() );
|
||||||
assertEquals( checkComment, i.getDetails().getComment() );
|
assertEquals( checkComment, i.getDetails().getComment() );
|
||||||
|
@ -254,7 +281,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
merged.setInjectedString( null );
|
merged.setInjectedString( null );
|
||||||
|
|
||||||
User loaded = ( User ) s.load(User.class, merged.getName());
|
User loaded = s.load( User.class, merged.getName() );
|
||||||
// the session-bound instance was not instantiated by the interceptor, load simply returns it
|
// the session-bound instance was not instantiated by the interceptor, load simply returns it
|
||||||
assertSame( merged, loaded );
|
assertSame( merged, loaded );
|
||||||
assertNull( merged.getInjectedString() );
|
assertNull( merged.getInjectedString() );
|
||||||
|
@ -263,7 +290,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
s.flush();
|
s.flush();
|
||||||
s.evict( merged );
|
s.evict( merged );
|
||||||
|
|
||||||
User reloaded = ( User ) s.load( User.class, merged.getName() );
|
User reloaded = s.load( User.class, merged.getName() );
|
||||||
// Interceptor IS called for instantiating the persistent instance associated to the session when using load
|
// Interceptor IS called for instantiating the persistent instance associated to the session when using load
|
||||||
assertEquals( injectedString, reloaded.getInjectedString() );
|
assertEquals( injectedString, reloaded.getInjectedString() );
|
||||||
assertEquals( u.getName(), reloaded.getName() );
|
assertEquals( u.getName(), reloaded.getName() );
|
||||||
|
@ -277,7 +304,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-6594")
|
@TestForIssue(jiraKey = "HHH-6594")
|
||||||
public void testPrepareStatementIntercept() {
|
public void testPrepareStatementIntercept() {
|
||||||
final Queue<String> expectedSQLs = new LinkedList<String>();
|
final Queue<String> expectedSQLs = new LinkedList<>();
|
||||||
// Transaction 1
|
// Transaction 1
|
||||||
expectedSQLs.add( "insert" );
|
expectedSQLs.add( "insert" );
|
||||||
// Transaction 2
|
// Transaction 2
|
||||||
|
@ -285,7 +312,7 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
expectedSQLs.add( "select" );
|
expectedSQLs.add( "select" );
|
||||||
// Transaction 3
|
// Transaction 3
|
||||||
expectedSQLs.add( "select" );
|
expectedSQLs.add( "select" );
|
||||||
expectedSQLs.add( "select" );
|
// expectedSQLs.add( "select" );
|
||||||
expectedSQLs.add( "update" );
|
expectedSQLs.add( "update" );
|
||||||
// Transaction 4
|
// Transaction 4
|
||||||
expectedSQLs.add( "select" );
|
expectedSQLs.add( "select" );
|
||||||
|
@ -296,7 +323,10 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
public String onPrepareStatement(String sql) {
|
public String onPrepareStatement(String sql) {
|
||||||
assertNotNull( sql );
|
assertNotNull( sql );
|
||||||
String expectedSql = expectedSQLs.poll().toLowerCase( Locale.ROOT );
|
String expectedSql = expectedSQLs.poll().toLowerCase( Locale.ROOT );
|
||||||
assertTrue("sql:\n " + sql.toLowerCase(Locale.ROOT) +"\n doesn't start with \n"+expectedSql+"\n", sql.toLowerCase(Locale.ROOT).startsWith( expectedSql ) );
|
assertTrue(
|
||||||
|
"sql:\n " + sql.toLowerCase( Locale.ROOT ) + "\n doesn't start with \n" + expectedSql + "\n",
|
||||||
|
sql.toLowerCase( Locale.ROOT ).startsWith( expectedSql )
|
||||||
|
);
|
||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -346,9 +376,11 @@ public class InterceptorTest extends BaseCoreFunctionalTestCase {
|
||||||
User u = new User( "Kinga", "Mroz" );
|
User u = new User( "Kinga", "Mroz" );
|
||||||
s.persist( u );
|
s.persist( u );
|
||||||
t.commit();
|
t.commit();
|
||||||
}catch (TransactionException e){
|
}
|
||||||
|
catch (TransactionException e) {
|
||||||
assertTrue( e.getCause() instanceof AssertionFailure );
|
assertTrue( e.getCause() instanceof AssertionFailure );
|
||||||
}finally {
|
}
|
||||||
|
finally {
|
||||||
s.close();
|
s.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -13,7 +13,7 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
|
|
||||||
import org.hibernate.EmptyInterceptor;
|
import org.hibernate.EmptyInterceptor;
|
||||||
import org.hibernate.Interceptor;
|
import org.hibernate.Interceptor;
|
||||||
|
@ -30,7 +30,7 @@ import static org.junit.Assert.assertTrue;
|
||||||
public class InterceptorTransactionEventTest extends BaseCoreFunctionalTestCase {
|
public class InterceptorTransactionEventTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransactionEvents() throws Exception {
|
public void testTransactionEvents() {
|
||||||
LoggingInterceptor interceptor = new LoggingInterceptor();
|
LoggingInterceptor interceptor = new LoggingInterceptor();
|
||||||
|
|
||||||
Session s = openSession(interceptor);
|
Session s = openSession(interceptor);
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: Log.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
//$Id: Log.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
||||||
public class Log {
|
public class Log {
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: PropertyInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
//$Id: PropertyInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
@ -15,12 +15,14 @@ import org.hibernate.type.Type;
|
||||||
|
|
||||||
public class PropertyInterceptor extends EmptyInterceptor {
|
public class PropertyInterceptor extends EmptyInterceptor {
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
||||||
currentState[1] = Calendar.getInstance();
|
currentState[1] = Calendar.getInstance();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
|
@Override
|
||||||
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) {
|
||||||
state[2] = Calendar.getInstance();
|
state[2] = Calendar.getInstance();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: StatefulInterceptor.java 7701 2005-07-30 05:07:01Z oneovthafew $
|
//$Id: StatefulInterceptor.java 7701 2005-07-30 05:07:01Z oneovthafew $
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -22,13 +22,15 @@ public class StatefulInterceptor extends EmptyInterceptor {
|
||||||
|
|
||||||
private List list = new ArrayList();
|
private List list = new ArrayList();
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
|
@Override
|
||||||
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) {
|
||||||
if ( !(entity instanceof Log) ) {
|
if ( !(entity instanceof Log) ) {
|
||||||
list.add( new Log( "insert", (String) id, entity.getClass().getName() ) );
|
list.add( new Log( "insert", (String) id, entity.getClass().getName() ) );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
|
||||||
if ( !(entity instanceof Log) ) {
|
if ( !(entity instanceof Log) ) {
|
||||||
list.add( new Log( "update", (String) id, entity.getClass().getName() ) );
|
list.add( new Log( "update", (String) id, entity.getClass().getName() ) );
|
||||||
|
@ -36,6 +38,7 @@ public class StatefulInterceptor extends EmptyInterceptor {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void postFlush(Iterator entities) {
|
public void postFlush(Iterator entities) {
|
||||||
if ( list.size()>0 ) {
|
if ( list.size()>0 ) {
|
||||||
for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
|
for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
|
|
@ -15,7 +15,7 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<hibernate-mapping
|
<hibernate-mapping
|
||||||
package="org.hibernate.test.interceptor">
|
package="org.hibernate.orm.test.interceptor">
|
||||||
|
|
||||||
<class name="User" table="users">
|
<class name="User" table="users">
|
||||||
<id name="name"/>
|
<id name="name"/>
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: User.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
//$Id: User.java 7700 2005-07-30 05:02:47Z oneovthafew $
|
||||||
package org.hibernate.test.interceptor;
|
package org.hibernate.orm.test.interceptor;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: Document.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: Document.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
import java.sql.Blob;
|
import java.sql.Blob;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: DocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: DocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
import java.sql.Blob;
|
import java.sql.Blob;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: DocumentInterceptor.java 7860 2005-08-11 21:58:23Z oneovthafew $
|
//$Id: DocumentInterceptor.java 7860 2005-08-11 21:58:23Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
@ -40,7 +40,7 @@ public class DocumentInterceptor implements Interceptor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state,
|
public boolean onSave(Object entity, Object id, Object[] state,
|
||||||
String[] propertyNames, Type[] types) throws CallbackException {
|
String[] propertyNames, Type[] types) throws CallbackException {
|
||||||
if ( entity instanceof Document ) {
|
if ( entity instanceof Document ) {
|
||||||
state[3] = state[2] = Calendar.getInstance();
|
state[3] = state[2] = Calendar.getInstance();
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: Folder.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: Folder.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: FolderImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: FolderImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* 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.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gavin King
|
||||||
|
*/
|
||||||
|
@DomainModel(
|
||||||
|
xmlMappings = { "org/hibernate/orm/test/interfaceproxy/Item.hbm.xml" }
|
||||||
|
)
|
||||||
|
@SessionFactory
|
||||||
|
public class InterfaceProxyTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RequiresDialectFeature(
|
||||||
|
feature = DialectFeatureChecks.SupportsExpectedLobUsagePattern.class,
|
||||||
|
comment = "database/driver does not support expected LOB usage pattern"
|
||||||
|
)
|
||||||
|
public void testInterfaceProxies(SessionFactoryScope scope) {
|
||||||
|
Document doc = new DocumentImpl();
|
||||||
|
SecureDocument doc2 = new SecureDocumentImpl();
|
||||||
|
try (Session session = openSession( scope )) {
|
||||||
|
session.beginTransaction();
|
||||||
|
try {
|
||||||
|
doc.setName( "Hibernate in Action" );
|
||||||
|
doc.setContent( session.getLobHelper().createBlob( "blah blah blah".getBytes() ) );
|
||||||
|
session.save( doc );
|
||||||
|
doc2.setName( "Secret" );
|
||||||
|
doc2.setContent( session.getLobHelper().createBlob( "wxyz wxyz".getBytes() ) );
|
||||||
|
// SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint
|
||||||
|
// column (0 <= val < 128)
|
||||||
|
doc2.setPermissionBits( (byte) 127 );
|
||||||
|
doc2.setOwner( "gavin" );
|
||||||
|
session.save( doc2 );
|
||||||
|
session.getTransaction().commit();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if ( session.getTransaction().isActive() ) {
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Long did = doc.getId();
|
||||||
|
Long d2id = doc2.getId();
|
||||||
|
|
||||||
|
try (Session session = openSession( scope )) {
|
||||||
|
session.beginTransaction();
|
||||||
|
try {
|
||||||
|
Document d = (Document) session.load( ItemImpl.class, did );
|
||||||
|
assertEquals( did, d.getId() );
|
||||||
|
assertEquals( "Hibernate in Action", d.getName() );
|
||||||
|
assertNotNull( d.getContent() );
|
||||||
|
|
||||||
|
SecureDocument d2 = (SecureDocument) session.load( ItemImpl.class, d2id );
|
||||||
|
assertEquals( d2id, d2.getId() );
|
||||||
|
assertEquals( "Secret", d2.getName() );
|
||||||
|
assertNotNull( d2.getContent() );
|
||||||
|
|
||||||
|
session.clear();
|
||||||
|
|
||||||
|
d = session.load( DocumentImpl.class, did );
|
||||||
|
assertEquals( did, d.getId() );
|
||||||
|
assertEquals( "Hibernate in Action", d.getName() );
|
||||||
|
assertNotNull( d.getContent() );
|
||||||
|
|
||||||
|
d2 = session.load( SecureDocumentImpl.class, d2id );
|
||||||
|
assertEquals( d2id, d2.getId() );
|
||||||
|
assertEquals( "Secret", d2.getName() );
|
||||||
|
assertNotNull( d2.getContent() );
|
||||||
|
assertEquals( "gavin", d2.getOwner() );
|
||||||
|
|
||||||
|
//s.clear();
|
||||||
|
|
||||||
|
d2 = session.load( SecureDocumentImpl.class, did );
|
||||||
|
assertEquals( did, d2.getId() );
|
||||||
|
assertEquals( "Hibernate in Action", d2.getName() );
|
||||||
|
assertNotNull( d2.getContent() );
|
||||||
|
|
||||||
|
try {
|
||||||
|
d2.getOwner(); //CCE
|
||||||
|
fail( "ClassCastException expected" );
|
||||||
|
}
|
||||||
|
catch (ClassCastException cce) {
|
||||||
|
//correct
|
||||||
|
}
|
||||||
|
|
||||||
|
session.createQuery( "delete ItemImpl" ).executeUpdate();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if ( session.getTransaction().isActive() ) {
|
||||||
|
session.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Session openSession(SessionFactoryScope scope) {
|
||||||
|
return scope.getSessionFactory()
|
||||||
|
.withOptions()
|
||||||
|
.interceptor( new DocumentInterceptor() )
|
||||||
|
.openSession();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<hibernate-mapping
|
<hibernate-mapping
|
||||||
package="org.hibernate.test.interfaceproxy">
|
package="org.hibernate.orm.test.interfaceproxy">
|
||||||
|
|
||||||
<class name="ItemImpl"
|
<class name="ItemImpl"
|
||||||
table="Items"
|
table="Items"
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: Item.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: Item.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: ItemImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: ItemImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: SecureDocument.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: SecureDocument.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: SecureDocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
//$Id: SecureDocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
|
||||||
package org.hibernate.test.interfaceproxy;
|
package org.hibernate.orm.test.interfaceproxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -29,12 +29,14 @@ public class ExceptionInterceptor extends EmptyInterceptor {
|
||||||
this.allowSave = allowSave;
|
this.allowSave = allowSave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
throws CallbackException {
|
throws CallbackException {
|
||||||
throw new IllegalStateException( EXCEPTION_MESSAGE );
|
throw new IllegalStateException( EXCEPTION_MESSAGE );
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
@Override
|
||||||
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
throws CallbackException {
|
throws CallbackException {
|
||||||
if (allowSave) return false;
|
if (allowSave) return false;
|
||||||
throw new IllegalStateException( EXCEPTION_MESSAGE );
|
throw new IllegalStateException( EXCEPTION_MESSAGE );
|
||||||
|
|
|
@ -19,7 +19,8 @@ import org.hibernate.type.Type;
|
||||||
public class LocalExceptionInterceptor extends ExceptionInterceptor {
|
public class LocalExceptionInterceptor extends ExceptionInterceptor {
|
||||||
public static final String LOCAL_EXCEPTION_MESSAGE = "Session-scoped interceptor enabled";
|
public static final String LOCAL_EXCEPTION_MESSAGE = "Session-scoped interceptor enabled";
|
||||||
|
|
||||||
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
@Override
|
||||||
|
public boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
throws CallbackException {
|
throws CallbackException {
|
||||||
if (allowSave) return false;
|
if (allowSave) return false;
|
||||||
throw new IllegalStateException( LOCAL_EXCEPTION_MESSAGE );
|
throw new IllegalStateException( LOCAL_EXCEPTION_MESSAGE );
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
|
@ -10,7 +10,7 @@
|
||||||
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
|
||||||
<hibernate-mapping
|
<hibernate-mapping
|
||||||
package="org.hibernate.test.proxy">
|
package="org.hibernate.orm.test.proxy">
|
||||||
|
|
||||||
<class name="DataPoint">
|
<class name="DataPoint">
|
||||||
<id name="id">
|
<id name="id">
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: DataPoint.java 10223 2006-08-04 20:29:21Z steve.ebersole@jboss.com $
|
//$Id: DataPoint.java 10223 2006-08-04 20:29:21Z steve.ebersole@jboss.com $
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.proxy;
|
package org.hibernate.orm.test.proxy;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -42,6 +42,11 @@ public class ProxyTest extends BaseCoreFunctionalTestCase {
|
||||||
return new String[] { "proxy/DataPoint.hbm.xml" };
|
return new String[] { "proxy/DataPoint.hbm.xml" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getBaseForMappings() {
|
||||||
|
return "org/hibernate/orm/test/";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configure(Configuration cfg) {
|
public void configure(Configuration cfg) {
|
||||||
super.configure( cfg );
|
super.configure( cfg );
|
|
@ -31,6 +31,7 @@ public class ProxyInterceptor extends EmptyInterceptor {
|
||||||
* @param object The presumed entity instance.
|
* @param object The presumed entity instance.
|
||||||
* @return The entity name (pointing to the proper entity mapping).
|
* @return The entity name (pointing to the proper entity mapping).
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String getEntityName(Object object) {
|
public String getEntityName(Object object) {
|
||||||
String entityName = ProxyHelper.extractEntityName( object );
|
String entityName = ProxyHelper.extractEntityName( object );
|
||||||
if ( entityName == null ) {
|
if ( entityName == null ) {
|
||||||
|
|
|
@ -19,6 +19,7 @@ public class EntityNameInterceptor extends EmptyInterceptor {
|
||||||
* @param object The presumed entity instance.
|
* @param object The presumed entity instance.
|
||||||
* @return The entity name (pointing to the proper entity mapping).
|
* @return The entity name (pointing to the proper entity mapping).
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String getEntityName(Object object) {
|
public String getEntityName(Object object) {
|
||||||
String entityName = ProxyHelper.extractEntityName( object );
|
String entityName = ProxyHelper.extractEntityName( object );
|
||||||
if ( entityName == null ) {
|
if ( entityName == null ) {
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.interfaceproxy;
|
|
||||||
|
|
||||||
import org.hibernate.Session;
|
|
||||||
import org.hibernate.Transaction;
|
|
||||||
|
|
||||||
import org.hibernate.testing.DialectChecks;
|
|
||||||
import org.hibernate.testing.RequiresDialectFeature;
|
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Gavin King
|
|
||||||
*/
|
|
||||||
public class InterfaceProxyTest extends BaseCoreFunctionalTestCase {
|
|
||||||
@Override
|
|
||||||
public String[] getMappings() {
|
|
||||||
return new String[] { "interfaceproxy/Item.hbm.xml" };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@RequiresDialectFeature(
|
|
||||||
value = DialectChecks.SupportsExpectedLobUsagePattern.class,
|
|
||||||
comment = "database/driver does not support expected LOB usage pattern"
|
|
||||||
)
|
|
||||||
public void testInterfaceProxies() {
|
|
||||||
Session s = openSession( new DocumentInterceptor() );
|
|
||||||
Transaction t = s.beginTransaction();
|
|
||||||
Document d = new DocumentImpl();
|
|
||||||
d.setName("Hibernate in Action");
|
|
||||||
d.setContent( s.getLobHelper().createBlob( "blah blah blah".getBytes() ) );
|
|
||||||
Long did = (Long) s.save(d);
|
|
||||||
SecureDocument d2 = new SecureDocumentImpl();
|
|
||||||
d2.setName("Secret");
|
|
||||||
d2.setContent( s.getLobHelper().createBlob( "wxyz wxyz".getBytes() ) );
|
|
||||||
// SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint
|
|
||||||
// column (0 <= val < 128)
|
|
||||||
d2.setPermissionBits( (byte) 127 );
|
|
||||||
d2.setOwner("gavin");
|
|
||||||
Long d2id = (Long) s.save(d2);
|
|
||||||
t.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession( new DocumentInterceptor() );
|
|
||||||
t = s.beginTransaction();
|
|
||||||
d = (Document) s.load(ItemImpl.class, did);
|
|
||||||
assertEquals( did, d.getId() );
|
|
||||||
assertEquals( "Hibernate in Action", d.getName() );
|
|
||||||
assertNotNull( d.getContent() );
|
|
||||||
|
|
||||||
d2 = (SecureDocument) s.load(ItemImpl.class, d2id);
|
|
||||||
assertEquals( d2id, d2.getId() );
|
|
||||||
assertEquals( "Secret", d2.getName() );
|
|
||||||
assertNotNull( d2.getContent() );
|
|
||||||
|
|
||||||
s.clear();
|
|
||||||
|
|
||||||
d = (Document) s.load(DocumentImpl.class, did);
|
|
||||||
assertEquals( did, d.getId() );
|
|
||||||
assertEquals( "Hibernate in Action", d.getName() );
|
|
||||||
assertNotNull( d.getContent() );
|
|
||||||
|
|
||||||
d2 = (SecureDocument) s.load(SecureDocumentImpl.class, d2id);
|
|
||||||
assertEquals( d2id, d2.getId() );
|
|
||||||
assertEquals( "Secret", d2.getName() );
|
|
||||||
assertNotNull( d2.getContent() );
|
|
||||||
assertEquals( "gavin", d2.getOwner() );
|
|
||||||
|
|
||||||
//s.clear();
|
|
||||||
|
|
||||||
d2 = (SecureDocument) s.load(SecureDocumentImpl.class, did);
|
|
||||||
assertEquals( did, d2.getId() );
|
|
||||||
assertEquals( "Hibernate in Action", d2.getName() );
|
|
||||||
assertNotNull( d2.getContent() );
|
|
||||||
|
|
||||||
try {
|
|
||||||
d2.getOwner(); //CCE
|
|
||||||
assertFalse(true);
|
|
||||||
}
|
|
||||||
catch (ClassCastException cce) {
|
|
||||||
//correct
|
|
||||||
}
|
|
||||||
|
|
||||||
s.createQuery( "delete ItemImpl" ).executeUpdate();
|
|
||||||
t.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class DocumentInterceptor implements Interceptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onSave(
|
public boolean onSave(
|
||||||
Object entity, Serializable id, Object[] state,
|
Object entity, Object id, Object[] state,
|
||||||
String[] propertyNames, Type[] types
|
String[] propertyNames, Type[] types
|
||||||
) throws CallbackException {
|
) throws CallbackException {
|
||||||
if ( entity instanceof Document ) {
|
if ( entity instanceof Document ) {
|
||||||
|
|
|
@ -180,6 +180,20 @@ where `param` is bound to `entityManager.getReference(EntityClass.class, 1)`.
|
||||||
** 'hibernate.classLoader.application', 'hibernate.classLoader.resources', 'hibernate.classLoader.hibernate' and 'hibernate.classLoader.environment': use 'hibernate.classLoaders' instead.
|
** 'hibernate.classLoader.application', 'hibernate.classLoader.resources', 'hibernate.classLoader.hibernate' and 'hibernate.classLoader.environment': use 'hibernate.classLoaders' instead.
|
||||||
** 'hibernate.hbm2dll.create_namespaces': use 'jakarta.persistence.create-database-schemas' or 'hibernate.hbm2ddl.create_namespaces'
|
** 'hibernate.hbm2dll.create_namespaces': use 'jakarta.persistence.create-database-schemas' or 'hibernate.hbm2ddl.create_namespaces'
|
||||||
|
|
||||||
|
=== org.hibernate.Interceptors
|
||||||
|
|
||||||
|
The method
|
||||||
|
```
|
||||||
|
boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
|
```
|
||||||
|
|
||||||
|
has been removed in favour of
|
||||||
|
```
|
||||||
|
boolean onSave(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=== Fetch behaviour change
|
=== Fetch behaviour change
|
||||||
|
|
||||||
We changed the way we detect circularity, we do not follow anymore a deep first detection, so what happens is that in a model like
|
We changed the way we detect circularity, we do not follow anymore a deep first detection, so what happens is that in a model like
|
||||||
|
|
Loading…
Reference in New Issue