Pourquoi peut - <exclude-unlisted-classes>false</exclude-unlisted-classes> ne pas fonctionner?

Avec cette persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
                        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">

    <persistence-unit name="ODP_Server_Test"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <!-- <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/ODPServerDataSource)</non-jta-data-source> -->
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:unit-testing;create=true" />
            <property name="javax.persistence.jdbc.user" value="" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.target-database" value="DERBY" />
        </properties>
    </persistence-unit>

</persistence>

et un test simple:

public class RepositoryTest {
private static Logger logger = LoggerFactory
.getLogger(RepositoryTest.class);
private static EntityManagerFactory emf;
private EntityManager em;
private RepositoryImpl repo = new RepositoryImpl();
@BeforeClass
public static void setUp() {
try {
logger.info("Starting in-memory DB for unit tests");
@SuppressWarnings("unused")
Class<?> cls = org.apache.derby.jdbc.EmbeddedDriver.class;
DriverManager.getConnection(
"jdbc:derby:memory:unit-testing;create=true").close();
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during database startup.");
}
try {
logger.info("Building JPA EntityManager for unit tests");
emf = Persistence.createEntityManagerFactory("ODP_Server_Test");
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during JPA EntityManager instantiation.");
}
}
@AfterClass
public static void tearDown() throws SQLException {
logger.info("Shutting down JPA");
if (emf != null) {
emf.close();
}
try {
DriverManager.getConnection(
"jdbc:derby:memory:unit-testing;drop=true").close();
} catch (SQLException ex) {
if (ex.getSQLState().equals("08006")) {
logger.info("DB shut down");
} else {
throw ex;
}
}
fail("DB didn't shut down");
}
@Before
public void setEM() {
em = emf.createEntityManager();
repo.setEntityManager(em);
}
@After
public void flushEM() {
if (em != null) {
em.flush();
em.close();
em = null;
}
}
@Test
public void noBlocksInEmptyDB() {
assertThat(repo.findFunBlock(1), is((FunctionalBlock) null));
}
}

- Je obtenir

[EL Avertissement]: 2012-04-17 15:08:18.476--La collection de types de méta-modèle est vide. Modèle de classes n'aient pas été trouvé lors de l'entité de recherche pour Java SE et certains Java EE container managed persistence unités. Veuillez vérifier que vos classes d'entités sont référencés dans persistence.xml en utilisant soit <class> éléments ou global <exclude-unlisted-classes>false</exclude-unlisted-classes> élément

Après le remplacement de <exclude-unlisted-classes>false</exclude-unlisted-classes> avec beaucoup de <class> éléments, le problème peut être résolu, mais je préférerais ne pas avoir à vous rappeler de le modifier persistence.xml à chaque fois que je besoin d'ajouter une nouvelle entité ou supprimer une ancienne. Pourquoi ne pas la version avec <exclude-unlisted-classes> travail?

  • Pourrait votre persistence.xml et annoté classes différentes classpath dossiers? Voir stackoverflow.com/questions/4885836/...
  • Oui, cela a fonctionné. Merci! (Sauf qu'il ne serait pas étendre ${project.build.outputDirectory} et je l'ai remplacé par ../classes; un peu méchant, mais je peux vivre avec ça si je dois le faire.)
  • Vous pouvez poster qu'une réponse afin que je puisse l'accepter.
  • Dans Eclipse, lorsque vous avez ajouté que le projet de la facette 'APP', vous pouvez faire un clic droit sur l'persistence.xml fichier => Sélectionnez "JPA Outils" > 'Synhronize liste de classe'.