0

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?

1 Answer 1

2

The problem was

localContainerEntityManagerFactoryBean.setPackagesToScan(getClass().getPackage().getName());

getClass().getPackage().getName() resolved to com.org.comma.persistence.config but all the entities were in com.org.comma.persistence

Doing the following

localContainerEntityManagerFactoryBean.setPackagesToScan("com.yahoo.comma.persistence");

helped me fix the issue and get rid of persistence.xml

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.