Skip to content

Commit

Permalink
fix(panache): repository operations failure with multiple persistence…
Browse files Browse the repository at this point in the history
… units in 1.8.0.cr1

Fixes quarkusio#11842
  • Loading branch information
machi1990 committed Sep 3, 2020
1 parent 4dec800 commit ee6a45b
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.util.JandexUtil;
import io.quarkus.hibernate.orm.deployment.AdditionalJpaModelBuildItem;
import io.quarkus.hibernate.orm.deployment.HibernateEnhancersRegisteredBuildItem;
import io.quarkus.hibernate.orm.deployment.JpaModelPersistenceUnitMappingBuildItem;
Expand Down Expand Up @@ -147,18 +148,28 @@ void build(PanacheKotlinHibernateOrmRecorder recorder,

KotlinPanacheRepositoryEnhancer daoEnhancer = new KotlinPanacheRepositoryEnhancer(index.getIndex());
Set<String> daoClasses = new HashSet<>();
Set<String> panacheEntities = new HashSet<>();

for (ClassInfo classInfo : index.getIndex().getAllKnownImplementors(PANACHE_REPOSITORY_BASE)) {
// Skip PanacheRepository
if (classInfo.name().equals(PANACHE_REPOSITORY))
if (classInfo.name().equals(PANACHE_REPOSITORY)) {
continue;
if (daoEnhancer.skipRepository(classInfo))
}
if (daoEnhancer.skipRepository(classInfo)) {
continue;
}
List<org.jboss.jandex.Type> typeParameters = JandexUtil
.resolveTypeParameters(classInfo.name(), PANACHE_REPOSITORY_BASE, index.getIndex());
panacheEntities.add(typeParameters.get(0).name().toString());
daoClasses.add(classInfo.name().toString());
}
for (ClassInfo classInfo : index.getIndex().getAllKnownImplementors(PANACHE_REPOSITORY)) {
if (daoEnhancer.skipRepository(classInfo))
if (daoEnhancer.skipRepository(classInfo)) {
continue;
}
List<org.jboss.jandex.Type> typeParameters = JandexUtil
.resolveTypeParameters(classInfo.name(), PANACHE_REPOSITORY, index.getIndex());
panacheEntities.add(typeParameters.get(0).name().toString());
daoClasses.add(classInfo.name().toString());
}
for (String daoClass : daoClasses) {
Expand Down Expand Up @@ -204,6 +215,7 @@ void build(PanacheKotlinHibernateOrmRecorder recorder,
}

Map<String, String> panacheEntityToPersistenceUnit = new HashMap<>();
panacheEntities.addAll(modelClasses);

if (jpaModelPersistenceUnitMapping.isPresent()) {
Map<String, Set<String>> collectedEntityToPersistenceUnits = jpaModelPersistenceUnitMapping.get()
Expand All @@ -213,7 +225,7 @@ void build(PanacheKotlinHibernateOrmRecorder recorder,
for (Map.Entry<String, Set<String>> entry : collectedEntityToPersistenceUnits.entrySet()) {
String entityName = entry.getKey();
Set<String> selectedPersistenceUnits = entry.getValue();
boolean isPanacheEntity = modelClasses.stream().anyMatch(name -> name.equals(entityName));
boolean isPanacheEntity = panacheEntities.stream().anyMatch(name -> name.equals(entityName));

if (!isPanacheEntity) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,29 +110,40 @@ PanacheEntityClassesBuildItem findEntityClasses(List<PanacheEntityClassBuildItem
}

@BuildStep
void build(CombinedIndexBuildItem index,
@Record(ExecutionTime.STATIC_INIT)
void build(
PanacheHibernateOrmRecorder recorder,
CombinedIndexBuildItem index,
ApplicationArchivesBuildItem applicationArchivesBuildItem,
BuildProducer<BytecodeTransformerBuildItem> transformers,
HibernateEnhancersRegisteredBuildItem hibernateMarker,
List<PanacheEntityClassBuildItem> entityClasses,
List<PanacheMethodCustomizerBuildItem> methodCustomizersBuildItems) throws Exception {
Optional<JpaModelPersistenceUnitMappingBuildItem> jpaModelPersistenceUnitMapping,
List<PanacheMethodCustomizerBuildItem> methodCustomizersBuildItems) {

List<PanacheMethodCustomizer> methodCustomizers = methodCustomizersBuildItems.stream()
.map(PanacheMethodCustomizerBuildItem::getMethodCustomizer).collect(Collectors.toList());

PanacheJpaRepositoryEnhancer daoEnhancer = new PanacheJpaRepositoryEnhancer(index.getIndex());
Set<String> panacheEntities = new HashSet<>();
Set<String> daoClasses = new HashSet<>();
for (ClassInfo classInfo : index.getIndex().getAllKnownImplementors(DOTNAME_PANACHE_REPOSITORY_BASE)) {
// Skip PanacheRepository
if (classInfo.name().equals(DOTNAME_PANACHE_REPOSITORY))
continue;
if (daoEnhancer.skipRepository(classInfo))
continue;
List<org.jboss.jandex.Type> typeParameters = JandexUtil
.resolveTypeParameters(classInfo.name(), DOTNAME_PANACHE_REPOSITORY_BASE, index.getIndex());
panacheEntities.add(typeParameters.get(0).name().toString());
daoClasses.add(classInfo.name().toString());
}
for (ClassInfo classInfo : index.getIndex().getAllKnownImplementors(DOTNAME_PANACHE_REPOSITORY)) {
if (daoEnhancer.skipRepository(classInfo))
continue;
List<org.jboss.jandex.Type> typeParameters = JandexUtil
.resolveTypeParameters(classInfo.name(), DOTNAME_PANACHE_REPOSITORY, index.getIndex());
panacheEntities.add(typeParameters.get(0).name().toString());
daoClasses.add(classInfo.name().toString());
}
for (String daoClass : daoClasses) {
Expand Down Expand Up @@ -186,6 +197,10 @@ void build(CombinedIndexBuildItem index,
}
}
}

panacheEntities.addAll(modelClasses);

recordPanacheEntityPersistenceUnits(recorder, jpaModelPersistenceUnitMapping, panacheEntities);
}

@BuildStep
Expand All @@ -205,11 +220,9 @@ ValidationPhaseBuildItem.ValidationErrorBuildItem validate(ValidationPhaseBuildI
return null;
}

@BuildStep
@Record(ExecutionTime.STATIC_INIT)
void persistenceUnits(PanacheHibernateOrmRecorder recorder,
void recordPanacheEntityPersistenceUnits(PanacheHibernateOrmRecorder recorder,
Optional<JpaModelPersistenceUnitMappingBuildItem> jpaModelPersistenceUnitMapping,
List<PanacheEntityClassBuildItem> panacheEntityClasses) {
Set<String> panacheEntityClasses) {
Map<String, String> panacheEntityToPersistenceUnit = new HashMap<>();
if (jpaModelPersistenceUnitMapping.isPresent()) {
Map<String, Set<String>> collectedEntityToPersistenceUnits = jpaModelPersistenceUnitMapping.get()
Expand All @@ -221,7 +234,7 @@ void persistenceUnits(PanacheHibernateOrmRecorder recorder,
String entityName = entry.getKey();
Set<String> selectedPersistenceUnits = entry.getValue();
boolean isPanacheEntity = panacheEntityClasses.stream()
.anyMatch(entity -> entity.get().name().toString().equals(entityName));
.anyMatch(entity -> entity.equals(entityName));

if (!isPanacheEntity) {
continue;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.repository;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Issue11842Entity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column(length = 64)
private String name;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.repository;

import javax.enterprise.context.ApplicationScoped;

import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;

@ApplicationScoped
public class Issue11842Repository implements PanacheRepositoryBase<Issue11842Entity, Integer> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.repository;

import javax.inject.Inject;
import javax.transaction.Transactional;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import org.jboss.resteasy.annotations.jaxrs.PathParam;

@Path("/repository")
public class Issue11842Resource {
@Inject
Issue11842Repository repository;

@GET
@Path("/{name}")
@Transactional
public String addAndReturnName(@PathParam String name) {
Issue11842Entity entity = new Issue11842Entity();
entity.setName(name);
repository.persist(entity);
return repository.findById(entity.getId()).getName();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.repository;

import org.hamcrest.Matchers;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.first.FirstEntity;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class MultiplePersistenceUnitConfigForRepositoryTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(Issue11842Entity.class, Issue11842Repository.class, Issue11842Resource.class, FirstEntity.class)
.addAsResource("application-multiple-persistence-units-for-repository.properties",
"application.properties"));

@Test
public void panacheOperations() {
RestAssured.when().get("/repository/name-1").then().body(Matchers.is("name-1"));
RestAssured.when().get("/repository/name-2").then().body(Matchers.is("name-2"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1

quarkus.datasource.repository.db-kind=h2
quarkus.datasource.repository.jdbc.url=jdbc:h2:mem:repository;DB_CLOSE_DELAY=-1

quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.packages=io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.first

quarkus.hibernate-orm."repository".dialect=org.hibernate.dialect.H2Dialect
quarkus.hibernate-orm."repository".database.generation=drop-and-create
quarkus.hibernate-orm."repository".datasource=repository
quarkus.hibernate-orm."repository".packages=io.quarkus.hibernate.orm.panache.deployment.test.multiple_pu.repository

0 comments on commit ee6a45b

Please sign in to comment.