/* * 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.cache.infinispan.functional.cluster; import java.util.Iterator; import java.util.List; import org.hibernate.cache.infinispan.util.InfinispanMessageLogger; import org.hibernate.test.cache.infinispan.functional.entities.Account; import org.hibernate.test.cache.infinispan.functional.entities.AccountHolder; import org.hibernate.Query; import org.hibernate.SessionFactory; import static org.hibernate.test.cache.infinispan.util.TxUtil.withTxSession; import static org.hibernate.test.cache.infinispan.util.TxUtil.withTxSessionApply; /** * @author Brian Stansberry */ public class AccountDAO { private static final InfinispanMessageLogger log = InfinispanMessageLogger.Provider.getLog(AccountDAO.class); private final boolean useJta; private final SessionFactory sessionFactory; private AccountHolder smith = new AccountHolder("Smith", "1000"); private AccountHolder jones = new AccountHolder("Jones", "2000"); private AccountHolder barney = new AccountHolder("Barney", "3000"); public AccountDAO(boolean useJta, SessionFactory sessionFactory) throws Exception { this.useJta = useJta; this.sessionFactory = sessionFactory; } public AccountHolder getSmith() { return smith; } public AccountHolder getJones() { return jones; } public AccountHolder getBarney() { return barney; } public void updateAccountBranch(Integer id, String branch) throws Exception { withTxSession(useJta, sessionFactory, session -> { log.debug("Updating account " + id + " to branch " + branch); Account account = session.get(Account.class, id); log.debug("Set branch " + branch); account.setBranch(branch); session.update(account); log.debug("Updated account " + id + " to branch " + branch); }); } public int getCountForBranch(String branch, boolean useRegion) throws Exception { return withTxSessionApply(useJta, sessionFactory, session -> { Query query = session.createQuery( "select account from Account as account where account.branch = :branch"); query.setString("branch", branch); if (useRegion) { query.setCacheRegion("AccountRegion"); } query.setCacheable(true); return query.list().size(); }); } public void createAccount(AccountHolder holder, Integer id, Integer openingBalance, String branch) throws Exception { withTxSession(useJta, sessionFactory, session -> { log.debug("Creating account " + id); Account account = new Account(); account.setId(id); account.setAccountHolder(holder); account.setBalance(openingBalance); log.debug("Set branch " + branch); account.setBranch(branch); session.persist(account); log.debug("Created account " + id); }); } public Account getAccount(Integer id) throws Exception { return withTxSessionApply(useJta, sessionFactory, session -> { log.debug("Getting account " + id); return session.get(Account.class, id); }); } public Account getAccountWithRefresh(Integer id) throws Exception { return withTxSessionApply(useJta, sessionFactory, session -> { log.debug("Getting account " + id + " with refresh"); Account acct = session.get(Account.class, id); session.refresh(acct); return session.get(Account.class, id); }); } public void updateAccountBalance(Integer id, Integer newBalance) throws Exception { withTxSession(useJta, sessionFactory, session -> { log.debug("Updating account " + id + " to balance " + newBalance); Account account = session.get(Account.class, id); account.setBalance(newBalance); session.update(account); log.debug("Updated account " + id + " to balance " + newBalance); }); } public String getBranch(Object holder, boolean useRegion) throws Exception { return withTxSessionApply(useJta, sessionFactory, session -> { Query query = session.createQuery( "select account.branch from Account as account where account.accountHolder = ?"); query.setParameter(0, holder); if (useRegion) { query.setCacheRegion("AccountRegion"); } query.setCacheable(true); return (String) query.list().get(0); }); } public int getTotalBalance(AccountHolder holder, boolean useRegion) throws Exception { List results = (List) withTxSessionApply(useJta, sessionFactory, session -> { Query query = session.createQuery( "select account.balance from Account as account where account.accountHolder = ?"); query.setParameter(0, holder); if (useRegion) { query.setCacheRegion("AccountRegion"); } query.setCacheable(true); return query.list(); }); int total = 0; if (results != null) { for (Iterator it = results.iterator(); it.hasNext();) { total += ((Integer) it.next()).intValue(); System.out.println("Total = " + total); } } return total; } public void cleanup() throws Exception { internalCleanup(); } private void internalCleanup() throws Exception { withTxSession(useJta, sessionFactory, session -> { Query query = session.createQuery("select account from Account as account"); List accts = query.list(); if (accts != null) { for (Iterator it = accts.iterator(); it.hasNext(); ) { try { Object acct = it.next(); log.info("Removing " + acct); session.delete(acct); } catch (Exception ignored) { } } } }); } public void remove() { try { internalCleanup(); } catch (Exception e) { log.error("Caught exception in remove", e); } } }