2012-04-17 4 views
7

Mit diesem persistence.xml:Warum konnte <exclude-unlisted-classes> false</ exclude-nichtlisted-classes> nicht funktionieren?

<?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> 

und ein einfacher Test:

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)); 
    } 
} 

ich

[EL Warnung]: 2012-04-17 15: 08: 18.476-- Die Sammlung von Metamodelltypen ist leer. Modellklassen wurden möglicherweise während der Entitätssuche nach Java SE und einigen durch Java EE-Container verwalteten Persistenzeinheiten nicht gefunden. Bitte überprüfen Sie, ob Ihre Entitätsklassen in persistence.xml referenziert werden entweder <class> Elemente oder ein globales <exclude-unlisted-classes>false</exclude-unlisted-classes> Element

Nach <exclude-unlisted-classes>false</exclude-unlisted-classes> mit vielen <class> Elementen zu ersetzen, kann das Problem behoben werden, aber ich würde es vorziehen, nicht zu Ich muss daran denken, jedes Mal, wenn ich eine neue Entität hinzufügen oder eine alte entfernen muss, persistence.xml zu bearbeiten. Warum funktioniert die Version mit <exclude-unlisted-classes> nicht?

+6

Könnten Ihre 'persistence.xml'- und annotierten Klassen in verschiedenen Klassenpfadordnern enden? Siehe http://stackoverflow.com/questions/4885836/no-autodetection-of-jpa-entities-in-maven-verify – axtavt

+1

Ja, es hat funktioniert. Vielen Dank! (Außer es würde '$ {project.build.outputDirectory}' nicht erweitern und ich ersetzte es durch '../ classes'; ein bisschen eklig, aber ich kann damit leben, wenn ich muss.) –

+1

@axtavt Sie können wollen um das als Antwort zu posten, damit ich es akzeptieren kann. –

Antwort

1

ich ähnliche Situation

konfrontiert hatte Wenn ich JPA Metamodell erzeugen, kopieren Sie sie in der richtigen thepacakge einfügen und überprüfen Sie es in zu SVN, und deaktivieren Metamodell Generation, alle JUnit-Tests waren in Ordnung

wenn ich generieren Metamodell mit jedem Build, bei junit Zeit - eingebettet Glasfischen werden alle ejb und Metamodell in Ordnung, aber nicht ejb junit fehl finden

ich das tun musste in meinem src/Test /resources/META-INF/persistence.xml

<persistence-unit name="test-xxx" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <jar-file>file:../classes</jar-file> 
    <shared-cache-mode>ALL</shared-cache-mode> 
    <properties> 
     <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.Oracle11Platform"/> 
     <property name="eclipselink.logging.timestamp" value="true"/> 
     <property name="eclipselink.logging.thread" value="true"/> 
     <property name="eclipselink.logging.level" value="FINE"/> 
     <property name="eclipselink.logging.parameters" value="true"/> 
     <property name="eclipselink.logging.logger" value="JavaLogger"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xxx"/> 
     <property name="javax.persistence.jdbc.password" value="xxx"/> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="javax.persistence.jdbc.user" value="xxx"/> 
    </properties> 
</persistence-unit> 
+0

Kannst du Klassenpakete wirklich so passieren? file: ../ com/package? – webyildirim

+0

das ist nicht wie java funktioniert, man baut immer classpath mit dir über com oder org etc –