2012-04-17 9 views
7

Con questo persistence.xml:Perché non è possibile eseguire <escludere-le classi non elencate> false</ exclude-non-elencate-classi>?

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

e un semplice 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)); 
    } 
} 

ottengo

[EL Attenzione]: 2012-04-17 15: 08: 18.476-- La raccolta dei tipi di metamodello è vuota. Le classi del modello potrebbero non essere state trovate durante la ricerca di entità per Java SE e alcune unità di persistenza gestite dal contenitore Java EE. Si prega di verificare che le classi di entità si fa riferimento in persistence.xml utilizzando sia <class> elementi o un <exclude-unlisted-classes>false</exclude-unlisted-classes> elemento globale

Dopo la sostituzione <exclude-unlisted-classes>false</exclude-unlisted-classes> con un sacco di <class> elementi, il problema può essere risolto, ma io preferisco non ricordarsi di modificare persistence.xml ogni volta che ho bisogno di aggiungere una nuova entità o rimuovere una vecchia. Perché la versione con <exclude-unlisted-classes> non funziona?

+6

Le tue 'persistence.xml' e le classi annotate possono finire in diverse cartelle del classpath? Vedi http://stackoverflow.com/questions/4885836/no-autodetection-of-jpa-entities-in-maven-verify – axtavt

+1

Sì, ha funzionato. Grazie! (Tranne che non espande '$ {project.build.outputDirectory}' e l'ho sostituito con '../ classes', un po 'brutto ma posso conviverci se devo.) –

+1

@axtavt Si consiglia per pubblicarlo come risposta, quindi posso accettarlo. –

risposta

1

avevo affrontato situazione simile

Se genero JPA metamodello, copiare incollarlo nella corretta pacakge e il check in a svn, e disabilitare la generazione metamodello, tutti i test JUnit erano soddisfacenti

se ho generare metamodel con ogni costruzione, in fase di JUnit - GlassFish incorporato troverà tutti EJB e metamodello bene, ma non JUnit EJB fallirà

ho dovuto fare questo nel mio src/prova /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

Puoi davvero passare pacchetti di classe come quello " file: ../ com/pacchetto? – webyildirim

+0

non è come funziona java, si crea sempre classpath con dir in cima a com o org ecc. –

Problemi correlati