Transakcje JPA

0
class NameRandomizer {

private List<String> names = Arrays.asList("John", "Brad", "Tommy");

    @Override
    public String getRandomValue() {
        return names.get(new Random().nextInt(2));
    }
}

Mam sobie klasę jak powyżej. Pomyślałem sobie, że fajnie by było, żeby za każdym razem kiedy będzie wywoływana metoda getRandomValue(), program pobierałby aktualną listę imion z bazy danych.

Mam bazę danych, mam klasę @Entity, w metodzie main() mogę utworzyć sobie instancję EntityManagera jak poniżej

public static void main(String[] args) {
		EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		
		entityManager.close();
		entityManagerFactory.close();
	}

i tam potrafię wykonywać proste zabiegi. W szczególności wyszukać wszystkie imiona z bazy.

Chciałbym, abyście podpowiedzieli mi jak mogę zrealizować mój pomysł, czyli jakby uruchamiać i zamykać transakcję EntityManagera przy wywoływaniu metody getRandomValue().

Miałem kilka pomysłów. Jednym z nich było

Korzystanie ze Spring Data i próba wykorzystania efektów jego działania poza kontenerem, dokumentacja wskazuje że tak można, ale jakoś mi to nie działa. Nawet lektura http://stackoverflow.com/questions/9123964/how-do-you-use-spring-data-jpa-outside-of-a-spring-container mało pomogła.

Jak się do tego zabrać? Nie wiem czy mieszanie Springa w tak trywialne zadanie ma sens. Jak można to wszytko ładnie pogodzić?

0

Działająca koncepcja jest następująca:

  1. Używam Spring Data, żeby zmieniejszyć do minimum ilość kodu potrzebną na operację wyszukiwania elementów z bazy i inicjuję bean-a kontekstu, najprymitywniej jak tylko się da, w samej klasie.
public class NameRandomizer implements Randomizer<String> {

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-persistence.xml");
    PersonRepository repository = context.getBean(PersonRepository.class);

    public String getRandomValue() {
        List<Person> persons = repository.findAll();
        return persons.get(new Random().nextInt(persons.size())).getName();
    }

}

Kod w sumie opisuje cały projekt. Posiadam w nim:

  1. Obiekt domenowy Person.class
  2. Konfigurację kontekstu dla połącznie z bazą applicationContext-persistence.xml
  3. Klasę implementującą SpringDatową JpaRepository<Person, Long> PersonRepository.class</code>, z niej właśnie pochodzi metoda <code>findAll()

Nie wiem czy komuś to pomoże, ale niech zostanie dla potomnych.

Oczywiście ten pomysł nie ma innych zalet, oprócz tego że działa i rozwiązuje mój problem przedstawiony na wstępie. Nie mniej jednak umieszczam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1