Esse erro ocorre porque o Hibernate não reconhece a classe CustomerModel
como uma entidade válida. Isso geralmente está relacionado a configurações incorretas no persistence.xml
ou à falta de anotações de entidade. Faz o seguinte para resolver o problema:
1. Verifique a Anotação da Classe CustomerModel
Certifique-se de que a classe CustomerModel
esteja anotada como uma entidade:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "customers")
public class CustomerModel {
@Id
private String id;
private String name;
private String street;
private int number;
private String zip;
private String city;
private boolean active;
private int rewardPoints;
// Construtor, getters e setters...
}
2. Verifique o Caminho da Entidade no persistence.xml
No seu persistence.xml
, você precisa registrar explicitamente a entidade CustomerModel
. Confirme que a tag <class>
está correta:
<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>br.com.desafio.infrastructure.customer.repository.hibernate.CustomerModel</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
3. Ajustes no Teste e no Repositório
Você está criando um CustomerRepository
dentro do teste manualmente, mas ele pode não estar configurado corretamente. Uma abordagem melhor seria injetar o EntityManagerFactory
para evitar a criação repetida da fábrica em cada teste. Segue uma sugestão de ajuste:
public class CustomerRepository implements CustomerRepositoryInterface {
private final EntityManagerFactory entityManagerFactory;
public CustomerRepository(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
@Override
public CompletableFuture<Void> create(Customer entity) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
CustomerModel customerModel = new CustomerModel(
entity.getId(), entity.getName(),
entity.getAddress().getStreet(), entity.getAddress().getNumber(),
entity.getAddress().getZip(), entity.getAddress().getCity(),
entity.isActive(), entity.getRewardPoints()
);
entityManager.persist(customerModel);
entityManager.getTransaction().commit();
entityManager.close();
return CompletableFuture.completedFuture(null);
}
}
E o teste pode ser ajustado para:
public class CustomerRepositoryTest {
private EntityManagerFactory entityManagerFactory;
private CustomerRepository customerRepository;
@Before
public void setUp() {
entityManagerFactory = Persistence.createEntityManagerFactory("testPU");
customerRepository = new CustomerRepository(entityManagerFactory);
}
@After
public void tearDown() {
entityManagerFactory.close();
}
@Test
public void shouldCreateCustomer() {
Customer customer = new Customer(UUID.randomUUID().toString(), "Samn");
Address address = new Address("Rua 2", 10, "64851-452", "Fortal");
customer.changeAddress(address);
customerRepository.create(customer);
CompletableFuture<Customer> foundCustomer = customerRepository.find(customer.getId());
assertNotNull(foundCustomer);
assertEquals(foundCustomer.join(), customer);
}
}
4. Sobre o application.properties
Como você está utilizando persistence.xml
para a configuração de persistência, não é necessário adicionar configurações de banco no application.properties
. Porém, se você decidir usar o Spring Boot futuramente, poderá mover essas configurações para o application.properties
. Um exemplo:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect