Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 22CE3200C5C for ; Thu, 20 Apr 2017 16:35:28 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 21523160B9F; Thu, 20 Apr 2017 14:35:28 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id E82A7160B91 for ; Thu, 20 Apr 2017 16:35:26 +0200 (CEST) Received: (qmail 12832 invoked by uid 500); 20 Apr 2017 14:35:26 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 12821 invoked by uid 99); 20 Apr 2017 14:35:26 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 20 Apr 2017 14:35:26 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 0ABEEDFF66; Thu, 20 Apr 2017 14:35:26 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Thu, 20 Apr 2017 14:35:26 -0000 Message-Id: <6ed705efb81e43e19501b415e8c4d3b8@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] ignite git commit: ignite-1794 hibernate 5.1 archived-at: Thu, 20 Apr 2017 14:35:28 -0000 Repository: ignite Updated Branches: refs/heads/ignite-1794 45c38bece -> 4291d7d43 ignite-1794 hibernate 5.1 Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/dc8c78c4 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/dc8c78c4 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/dc8c78c4 Branch: refs/heads/ignite-1794 Commit: dc8c78c4e40a839815d0081d45a37247f6e4da58 Parents: 09e34270 Author: sboikov Authored: Thu Apr 20 17:33:21 2017 +0300 Committer: sboikov Committed: Thu Apr 20 17:33:21 2017 +0300 ---------------------------------------------------------------------- modules/hibernate-4.2/pom.xml | 7 + .../HibernateL2CacheConfigurationSelfTest.java | 1 + .../hibernate/HibernateL2CacheMultiJvmTest.java | 444 +++++++++++++++++++ .../HibernateNonStrictAccessStrategy.java | 10 + .../ignite/cache/hibernate/package-info.java | 24 + 5 files changed, 486 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/dc8c78c4/modules/hibernate-4.2/pom.xml ---------------------------------------------------------------------- diff --git a/modules/hibernate-4.2/pom.xml b/modules/hibernate-4.2/pom.xml index e3470a0..c597b21 100644 --- a/modules/hibernate-4.2/pom.xml +++ b/modules/hibernate-4.2/pom.xml @@ -123,6 +123,13 @@ ${spring.version} test + + + com.thoughtworks.xstream + xstream + 1.4.8 + test + http://git-wip-us.apache.org/repos/asf/ignite/blob/dc8c78c4/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java index b8b2c34..cb179c4 100644 --- a/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java @@ -130,6 +130,7 @@ public class HibernateL2CacheConfigurationSelfTest extends GridCommonAbstractTes return cfg; } + /** * @param igniteInstanceName Ignite instance name. * @return Hibernate configuration. http://git-wip-us.apache.org/repos/asf/ignite/blob/dc8c78c4/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java ---------------------------------------------------------------------- diff --git a/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java new file mode 100644 index 0000000..bd976ad --- /dev/null +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java @@ -0,0 +1,444 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.cache.hibernate; + +import javax.persistence.Cacheable; +import javax.persistence.Id; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCompute; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.resources.IgniteInstanceResource; +import org.apache.ignite.resources.LoggerResource; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.cache.spi.access.AccessType; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistryBuilder; + +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_CACHE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.IGNITE_INSTANCE_NAME_PROPERTY; +import static org.hibernate.cfg.AvailableSettings.CACHE_REGION_FACTORY; +import static org.hibernate.cfg.AvailableSettings.GENERATE_STATISTICS; +import static org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO; +import static org.hibernate.cfg.AvailableSettings.RELEASE_CONNECTIONS; +import static org.hibernate.cfg.AvailableSettings.USE_QUERY_CACHE; +import static org.hibernate.cfg.AvailableSettings.USE_SECOND_LEVEL_CACHE; + +/** + * + */ +public class HibernateL2CacheMultiJvmTest extends GridCommonAbstractTest { + /** */ + static final String CONNECTION_URL = "jdbc:h2:mem:example;DB_CLOSE_DELAY=-1"; + + /** */ + private static final String CACHE_NAME = "hibernateCache"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (!getTestIgniteInstanceName(0).equals(igniteInstanceName)) + cfg.setClientMode(true); + + CacheConfiguration ccfg = new CacheConfiguration(); + + ccfg.setName(CACHE_NAME); + ccfg.setWriteSynchronizationMode(FULL_SYNC); + + cfg.setCacheConfiguration(ccfg); + + cfg.setMarshaller(new BinaryMarshaller()); + cfg.setPeerClassLoadingEnabled(false); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected boolean isMultiJvm() { + return true; + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + startGrid(0); + + startGrid(1); + startGrid(2); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + super.afterTestsStopped(); + } + + /** + * @throws Exception If failed. + */ + public void testL2Cache() throws Exception { + Ignite srv = ignite(0); + + IgniteCompute client1Compute = + srv.compute(srv.cluster().forNodeId(ignite(1).cluster().localNode().id())); + + client1Compute.run(new HibernateRunnable()); + + IgniteCompute client2Compute = + srv.compute(srv.cluster().forNodeId(ignite(2).cluster().localNode().id())); + + client2Compute.run(new HibernateRunnable2()); + } + + /** + * + */ + private static class HibernateRunnable2 extends HibernateRunnable { + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = (Entity1)ses.load(Entity1.class, i); + + log.info("Found: " + e.getName()); + } + { + Entity2 e = (Entity2)ses.load(Entity2.class, String.valueOf(i)); + + log.info("Found: " + e.getName()); + } + { + Entity3 e = (Entity3)ses.load(Entity3.class, (double)i); + + log.info("Found: " + e.getName()); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + } + + /** + * + */ + private static class HibernateRunnable implements IgniteRunnable { + /** */ + @IgniteInstanceResource + protected Ignite ignite; + + @LoggerResource + protected IgniteLogger log; + + /** {@inheritDoc} */ + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = new Entity1(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity2 e = new Entity2(); + e.setId(String.valueOf(i)); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity3 e = new Entity3(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + + /** + * @param igniteInstanceName Name of the grid providing caches. + * @return Session factory. + */ + protected SessionFactory startHibernate(String igniteInstanceName) { + log.info("Start hibernate on node: " + igniteInstanceName); + + Configuration cfg = hibernateConfiguration(igniteInstanceName); + + ServiceRegistryBuilder builder = new ServiceRegistryBuilder(); + + builder.applySetting("hibernate.connection.url", CONNECTION_URL); + builder.applySetting("hibernate.show_sql", true); + + return cfg.buildSessionFactory(builder.buildServiceRegistry()); + } + + /** + * @param igniteInstanceName Ignite instance name. + * @return Hibernate configuration. + */ + protected Configuration hibernateConfiguration(String igniteInstanceName) { + Configuration cfg = new Configuration(); + + cfg.addAnnotatedClass(Entity1.class); + cfg.addAnnotatedClass(Entity2.class); + cfg.addAnnotatedClass(Entity3.class); + + cfg.setProperty(DFLT_ACCESS_TYPE_PROPERTY, AccessType.NONSTRICT_READ_WRITE.name()); + + cfg.setProperty(HBM2DDL_AUTO, "create"); + + cfg.setProperty(GENERATE_STATISTICS, "true"); + + cfg.setProperty(USE_SECOND_LEVEL_CACHE, "true"); + + cfg.setProperty(USE_QUERY_CACHE, "true"); + + cfg.setProperty(CACHE_REGION_FACTORY, HibernateRegionFactory.class.getName()); + + cfg.setProperty(RELEASE_CONNECTIONS, "on_close"); + + cfg.setProperty(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + + cfg.setProperty(DFLT_CACHE_NAME_PROPERTY, CACHE_NAME); + + return cfg; + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity1 { + /** */ + @Id + private int id; + + /** */ + private String name; + + /** + * @return ID. + */ + public int getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(int id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity1 entity1 = (Entity1)o; + + return id == entity1.id; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id; + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity2 { + /** */ + @Id + private String id; + + /** */ + private String name; + + /** + * @return ID. + */ + public String getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity2 entity2 = (Entity2)o; + + return id.equals(entity2.id); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id.hashCode(); + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity3 { + /** */ + @Id + private double id; + + /** */ + private String name; + + /** + * @return ID. + */ + public double getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(double id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity3 entity3 = (Entity3)o; + + return Double.compare(entity3.id, id) == 0; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + long temp = Double.doubleToLongBits(id); + return (int)(temp ^ (temp >>> 32)); + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/dc8c78c4/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java ---------------------------------------------------------------------- diff --git a/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java index 92de24a..06c6f3d 100644 --- a/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java @@ -23,7 +23,9 @@ import java.util.Set; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.util.GridLeanSet; +import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * Implementation of NONSTRICT_READ_WRITE cache access strategy. @@ -149,12 +151,15 @@ public class HibernateNonStrictAccessStrategy extends HibernateAccessStrategyAda @SuppressWarnings("TypeMayBeWeakened") private static class WriteContext { /** */ + @GridToStringInclude private Map updates; /** */ + @GridToStringInclude private Set rmvs; /** */ + @GridToStringInclude private Set locked = new GridLeanSet<>(); /** @@ -216,5 +221,10 @@ public class HibernateNonStrictAccessStrategy extends HibernateAccessStrategyAda if (!F.isEmpty(updates)) cache.putAll(updates); } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(WriteContext.class, this); + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/dc8c78c4/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java ---------------------------------------------------------------------- diff --git a/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java new file mode 100644 index 0000000..1179aec --- /dev/null +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * + * Contains implementation of Hibernate L2 cache. Refer to + * org.apache.ignite.examples.datagrid.hibernate.HibernateL2CacheExample for more information on how to + * configure and use Ignite with Hibernate. + */ +package org.apache.ignite.cache.hibernate; \ No newline at end of file