My project structure looks like
persistence/pom.xml
src/main/java/
ApplicationConfig
NetworkRepository
NetworkRepositoryImpl
Network
src/main/test/NetworkRepositoryTest
My ApplicationConfig looks like
@Configuration
@ComponentScan
@EnableJpaRepositories
public class ApplicationConfig {
@Bean
public DataSource dataSource() {
final EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder();
embeddedDatabaseBuilder.setType(EmbeddedDatabaseType.H2);
return embeddedDatabaseBuilder.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setDatabase(Database.H2);
jpaVendorAdapter.setGenerateDdl(true);
final LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
localContainerEntityManagerFactoryBean.setPackagesToScan(getClass().getPackage().getName());
localContainerEntityManagerFactoryBean.setDataSource(dataSource());
localContainerEntityManagerFactoryBean.setPersistenceUnitName("test-comma-pu");
return localContainerEntityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager transactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
my Network entity looks like
import javax.annotation.Nonnull;
import javax.persistence.Entity;
import org.joda.time.DateTime;
@Entity
public class Network extends AbstractEntity {
private final long networkId;
private final String name;
private final boolean active;
private final DateTime createdAt;
private String createdBy;
private DateTime updatedAt;
private String updatedBy;
...
}
My NetworkRepository looks like
import java.util.List;
import javax.annotation.Nonnull;
import org.springframework.data.repository.Repository;
import com.org.comma.persistence.entities.Network;
public interface NetworkRepository extends Repository<Network, Long> {
@Nonnull
List<Network> findAll();
@Nonnull
Network save(@Nonnull final Network network);
}
My NetworkRepositoryImpl looks like
@Repository
@Transactional
public class NetworkRepositoryImpl implements NetworkRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
@Nonnull
public List<Network> findAll() {
return Collections.emptyList();
}
@Nonnull
@Override
public Network save(@Nonnull final Network network) {
if (network.getId() == null) {
entityManager.persist(network);
return network;
} else {
return entityManager.merge(network);
}
}
}
and my Test looks like
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationConfig.class, NetworkRepositoryImpl.class})
@Transactional
public class NetworkRepositoryTest {
@Autowired
NetworkRepository networkRepository;
@Test
public void testAllNetworks() {
Network network = new Network(1, "US", true, DateTime.now());
network = networkRepository.save(network);
final List<Network> networks = networkRepository.findAll();
assertTrue(networks.isEmpty());
}
}
When I run test, I see error as
java.lang.IllegalArgumentException: Unknown entity: com.org.comma.persistence.entities.Network
I found people recommending to have persistence.xml, My question is when I am already using Java Based Configuration(ApplicationConfig) and also set the base packages to scan
localContainerEntityManagerFactoryBean.setPackagesToScan(getClass().getPackage().getName());
even in that case I need persistence.xml?