Skip to content
This repository has been archived by the owner on Jan 5, 2023. It is now read-only.

Commit

Permalink
Add manual Collection invalidation on bulk SQL
Browse files Browse the repository at this point in the history
  • Loading branch information
vladmihalcea committed May 8, 2015
1 parent c4db4cf commit fd747c6
Showing 1 changed file with 78 additions and 24 deletions.
Expand Up @@ -3,10 +3,14 @@
import com.vladmihalcea.hibernate.masterclass.laboratory.util.AbstractTest;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.jdbc.Work;
import org.junit.Before;
import org.junit.Test;

import javax.persistence.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
Expand Down Expand Up @@ -76,39 +80,45 @@ public void testLoadFromCollectionCache() {
}

@Test
public void testInvalidateEntityCollectionCacheOnRemovingEntries() {
LOGGER.info("Invalidate entity collection cache on removing entries");
public void testInvalidateEntityCollectionCacheOnAddingEntries() {
LOGGER.info("Adding invalidates Collection Cache");
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
assertEquals(2, repository.getCommits().size());
repository.removeCommit(repository.getCommits().get(0));

Commit commit = new Commit();
commit.getChanges().add(
new Change("Main.java", "0b3,17...")
);
repository.addCommit(commit);
});
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
assertEquals(1, repository.getCommits().size());
Repository repository = (Repository)
session.get(Repository.class, 1L);
assertEquals(3, repository.getCommits().size());
});
}

@Test
public void testInvalidateEntityCollectionCacheOnAddingEntries() {
LOGGER.info("Invalidate entity collection cache on adding entries");
public void testInvalidateEntityCollectionCacheOnRemovingEntries() {
LOGGER.info("Removing invalidates Collection Cache");
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
assertEquals(2, repository.getCommits().size());

Commit commit = new Commit();
commit.getChanges().add(new Change("Main.java", "0b3,17..."));
repository.addCommit(commit);
repository.removeCommit(repository.getCommits().get(0));
});
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
assertEquals(3, repository.getCommits().size());
Repository repository = (Repository)
session.get(Repository.class, 1L);
assertEquals(1, repository.getCommits().size());
});
}

@Test
public void testConsistencyIssuesWhenRemovingChildDirectly() {
LOGGER.info("Removing a Child directly may cause inconsistencies");
LOGGER.info("Removing Child causes inconsistencies");
doInTransaction(session -> {
Commit commit = (Commit) session.get(Commit.class, 1L);
session.delete(commit);
Expand All @@ -124,45 +134,89 @@ public void testConsistencyIssuesWhenRemovingChildDirectly() {
}

@Test
public void testConsistencyIssuesWhenHQLUpdating() {
public void testConsistencyWhenHQLUpdating() {
LOGGER.info("Updating Child entities using HQL");
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
for (Commit commit : repository.getCommits()) {
assertFalse(commit.review);
}
});
doInTransaction(session -> {
session.createQuery("update Commit c set c.review = true ").executeUpdate();
session.createQuery(
"update Commit c " +
"set c.review = true ")
.executeUpdate();
});
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
for(Commit commit : repository.getCommits()) {
assertTrue(commit.review);
}
});
}

@Test
public void testConsistencyIssuesWhenSQLUpdating() {
public void testConsistencyWhenSQLUpdating() {
LOGGER.info("Updating Child entities using SQL");
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
for (Commit commit : repository.getCommits()) {
assertFalse(commit.review);
}
});
doInTransaction(session -> {
session.createSQLQuery("update Commit c set c.review = true ").executeUpdate();
session.createSQLQuery(
"update Commit c " +
"set c.review = true ")
.executeUpdate();
});
doInTransaction(session -> {
Repository repository = (Repository) session.get(Repository.class, 1L);
Repository repository = (Repository)
session.get(Repository.class, 1L);
for(Commit commit : repository.getCommits()) {
assertTrue(commit.review);
}
});
}

@Test
public void testConsistencyWhenManuallySQLUpdating() {
LOGGER.info("Manually updating Child entities using SQL");
final Repository repository = doInTransaction(session -> {
Repository _repository = (Repository)
session.get(Repository.class, 1L);
for (Commit commit : _repository.getCommits()) {
assertFalse(commit.review);
}
return _repository;
});
doInTransaction(session -> {
session.doWork(connection -> {
try (PreparedStatement statement = connection.prepareStatement(
"update Commit c " +
"set c.review = true "
)) {
statement.executeUpdate();
}
});
session.getSessionFactory().getCache().evictCollection(
Repository.class.getName() + ".commits",
repository.getId()
);
});
doInTransaction(session -> {
Repository _repository = (Repository)
session.get(Repository.class, 1L);
for(Commit commit : _repository.getCommits()) {
assertTrue(commit.review);
}
});
}

@Test
public void testInvalidateEmbeddableCollectionCacheOnRemovingEntries() {
LOGGER.info("Invalidate embeddable collection cache on removing entries");
Expand Down

0 comments on commit fd747c6

Please sign in to comment.