/*
* 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.locking.warning;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import org.jboss.byteman.contrib.bmunit.BMRule;
import org.jboss.byteman.contrib.bmunit.BMRules;
import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
import org.jboss.logging.Logger;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.loader.Loader;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.hibernate.testing.logger.LoggerInspectionRule;
import org.hibernate.testing.logger.Triggerable;
import org.hibernate.testing.transaction.TransactionUtil;
import static org.junit.Assert.assertFalse;
/**
* @author Andrea Boriero
*/
@TestForIssue(jiraKey = "HHH-10513")
@RunWith(BMUnitRunner.class)
public class LockNoneWarmingTest extends BaseCoreFunctionalTestCase {
private Triggerable triggerable;
@Rule
public LoggerInspectionRule logInspection = new LoggerInspectionRule(
Logger.getMessageLogger( CoreMessageLogger.class, Loader.class.getName() )
);
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {Item.class, Bid.class};
}
@Before
public void setUp() {
buildSessionFactory();
final Set messagesPrefixes = new HashSet<>();
messagesPrefixes.add( "HHH000444" );
messagesPrefixes.add( "HHH000445" );
triggerable = logInspection.watchForLogMessages( messagesPrefixes );
TransactionUtil.doInHibernate( this::sessionFactory, session -> {
Item item = new Item();
item.name = "ZZZZ";
session.persist( item );
} );
}
@After
public void tearDown(){
releaseSessionFactory();
triggerable.reset();
}
@Test
@BMRules(rules = {
@BMRule(targetClass = "org.hibernate.dialect.Dialect",
targetMethod = "useFollowOnLocking",
action = "return true",
name = "H2DialectUseFollowOnLocking")
})
public void testQuerySetLockModeNONEDoNotLogAWarnMessageWhenTheDialectUseFollowOnLockingIsTrue() {
try (Session s = openSession();) {
final Query query = s.createQuery( "from Item i join i.bids b where name = :name" );
query.setParameter( "name", "ZZZZ" );
query.setLockMode( "i", LockMode.NONE );
query.setLockMode( "b", LockMode.NONE );
query.list();
assertFalse( triggerable.triggerMessage(), triggerable.wasTriggered() );
}
}
@Entity(name = "Item")
@Table(name = "ITEM")
public static class Item implements Serializable {
@Id
String name;
@OneToMany(mappedBy = "item", fetch = FetchType.EAGER)
Set<Bid> bids = new HashSet<Bid>();
}
@Entity(name = "Bid")
@Table(name = "BID")
public static class Bid implements Serializable {
@Id
float amount;
@Id
@ManyToOne
Item item;
}
}