Skip to content

Commit 6d34661

Browse files
committed
Use Quarkus application framework - step 4: use Panache and @transactional
1 parent 81066e7 commit 6d34661

File tree

4 files changed

+54
-53
lines changed

4 files changed

+54
-53
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package eu.happycoders.shop.adapter.out.persistence.jpa;
2+
3+
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
4+
import jakarta.enterprise.context.ApplicationScoped;
5+
6+
/**
7+
* Panache repository for {@link CartJpaEntity}.
8+
*
9+
* @author Sven Woltmann
10+
*/
11+
@ApplicationScoped
12+
public class JpaCartPanacheRepository implements PanacheRepositoryBase<CartJpaEntity, Integer> {}

adapter/src/main/java/eu/happycoders/shop/adapter/out/persistence/jpa/JpaCartRepository.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import eu.happycoders.shop.model.customer.CustomerId;
66
import io.quarkus.arc.lookup.LookupIfProperty;
77
import jakarta.enterprise.context.ApplicationScoped;
8-
import jakarta.persistence.EntityManager;
9-
import jakarta.persistence.EntityManagerFactory;
8+
import jakarta.transaction.Transactional;
109
import java.util.Optional;
1110

1211
/**
@@ -18,41 +17,28 @@
1817
@ApplicationScoped
1918
public class JpaCartRepository implements CartRepository {
2019

21-
private final EntityManagerFactory entityManagerFactory;
20+
private final JpaCartPanacheRepository panacheRepository;
2221

23-
public JpaCartRepository(EntityManagerFactory entityManagerFactory) {
24-
this.entityManagerFactory = entityManagerFactory;
22+
public JpaCartRepository(JpaCartPanacheRepository panacheRepository) {
23+
this.panacheRepository = panacheRepository;
2524
}
2625

2726
@Override
27+
@Transactional
2828
public void save(Cart cart) {
29-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
30-
entityManager.getTransaction().begin();
31-
entityManager.merge(CartMapper.toJpaEntity(cart));
32-
entityManager.getTransaction().commit();
33-
}
29+
panacheRepository.getEntityManager().merge(CartMapper.toJpaEntity(cart));
3430
}
3531

3632
@Override
33+
@Transactional
3734
public Optional<Cart> findByCustomerId(CustomerId customerId) {
38-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
39-
CartJpaEntity cartJpaEntity = entityManager.find(CartJpaEntity.class, customerId.value());
40-
return CartMapper.toModelEntityOptional(cartJpaEntity);
41-
}
35+
CartJpaEntity cartJpaEntity = panacheRepository.findById(customerId.value());
36+
return CartMapper.toModelEntityOptional(cartJpaEntity);
4237
}
4338

4439
@Override
40+
@Transactional
4541
public void deleteByCustomerId(CustomerId customerId) {
46-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
47-
entityManager.getTransaction().begin();
48-
49-
CartJpaEntity cartJpaEntity = entityManager.find(CartJpaEntity.class, customerId.value());
50-
51-
if (cartJpaEntity != null) {
52-
entityManager.remove(cartJpaEntity);
53-
}
54-
55-
entityManager.getTransaction().commit();
56-
}
42+
panacheRepository.deleteById(customerId.value());
5743
}
5844
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package eu.happycoders.shop.adapter.out.persistence.jpa;
2+
3+
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
4+
import jakarta.enterprise.context.ApplicationScoped;
5+
6+
/**
7+
* Panache repository for {@link ProductJpaEntity}.
8+
*
9+
* @author Sven Woltmann
10+
*/
11+
@ApplicationScoped
12+
public class JpaProductPanacheRepository
13+
implements PanacheRepositoryBase<ProductJpaEntity, String> {}

adapter/src/main/java/eu/happycoders/shop/adapter/out/persistence/jpa/JpaProductRepository.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
import eu.happycoders.shop.model.product.Product;
66
import eu.happycoders.shop.model.product.ProductId;
77
import io.quarkus.arc.lookup.LookupIfProperty;
8+
import jakarta.annotation.PostConstruct;
89
import jakarta.enterprise.context.ApplicationScoped;
9-
import jakarta.persistence.EntityManager;
10-
import jakarta.persistence.EntityManagerFactory;
11-
import jakarta.persistence.TypedQuery;
10+
import jakarta.transaction.Transactional;
1211
import java.util.List;
1312
import java.util.Optional;
1413

@@ -21,47 +20,38 @@
2120
@ApplicationScoped
2221
public class JpaProductRepository implements ProductRepository {
2322

24-
private final EntityManagerFactory entityManagerFactory;
23+
private final JpaProductPanacheRepository panacheRepository;
2524

26-
public JpaProductRepository(EntityManagerFactory entityManagerFactory) {
27-
this.entityManagerFactory = entityManagerFactory;
28-
createDemoProducts();
25+
public JpaProductRepository(JpaProductPanacheRepository panacheRepository) {
26+
this.panacheRepository = panacheRepository;
2927
}
3028

31-
private void createDemoProducts() {
29+
@PostConstruct
30+
void createDemoProducts() {
3231
DemoProducts.DEMO_PRODUCTS.forEach(this::save);
3332
}
3433

3534
@Override
35+
@Transactional
3636
public void save(Product product) {
37-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
38-
entityManager.getTransaction().begin();
39-
entityManager.merge(ProductMapper.toJpaEntity(product));
40-
entityManager.getTransaction().commit();
41-
}
37+
panacheRepository.getEntityManager().merge(ProductMapper.toJpaEntity(product));
4238
}
4339

4440
@Override
41+
@Transactional
4542
public Optional<Product> findById(ProductId productId) {
46-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
47-
ProductJpaEntity jpaEntity = entityManager.find(ProductJpaEntity.class, productId.value());
48-
return ProductMapper.toModelEntityOptional(jpaEntity);
49-
}
43+
ProductJpaEntity jpaEntity = panacheRepository.findById(productId.value());
44+
return ProductMapper.toModelEntityOptional(jpaEntity);
5045
}
5146

5247
@Override
48+
@Transactional
5349
public List<Product> findByNameOrDescription(String queryString) {
54-
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
55-
TypedQuery<ProductJpaEntity> query =
56-
entityManager
57-
.createQuery(
58-
"from ProductJpaEntity where name like :query or description like :query",
59-
ProductJpaEntity.class)
60-
.setParameter("query", "%" + queryString + "%");
50+
List<ProductJpaEntity> entities =
51+
panacheRepository
52+
.find("name like ?1 or description like ?1", "%" + queryString + "%")
53+
.list();
6154

62-
List<ProductJpaEntity> entities = query.getResultList();
63-
64-
return ProductMapper.toModelEntities(entities);
65-
}
55+
return ProductMapper.toModelEntities(entities);
6656
}
6757
}

0 commit comments

Comments
 (0)