2010-10-29 9 views
29

मुझे अपने persistence.xml के <jta-data-source> में कितना मूल्य रखना चाहिए?persistence.xml का jta-data-source में क्या डालना है?

ग्लासफ़िश व्यवस्थापक पैनल में मैंने डेटास्रोत नाम "abcDS" बनाया।

[...] 
abcDS=new://Resource?type=DataSource 
abcDS.JdbcDriver=org.hsqldb.jdbcDriver 
abcDS.JdbcUrl=jdbc:hsqldb:mem:testdb 
abcDS.JtaManaged=true 
[...] 

क्या मैं persistence.xml में जगह होगी: मेरी jndi.properties (src/test/resources अंदर) में मैं इसे इस तरह परिभाषित किया गया? मुझे नेट में बहुत सारे रूप हैं, जैसे: "jdbc/abcDS", "java:/abcDS", "abcDS"। कौनसा सही हैं? और इसके लिए कुछ नियम है? मैं समझता हूँ कि यह JNDI से संबंधित है, लेकिन ...

मैं अपने इकाई परीक्षण में ईएमएफ बनाने के लिए कोशिश कर रहा हूँ:

[...] 
SEVERE: Could not find datasource: abcDS javax.naming.NameNotFoundException: 
    Name "abcDS" not found. 
at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:193) 
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:150) 
at org.apache.openejb.core.ivm.naming.ContextWrapper.lookup(ContextWrapper.java:115) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 
[...] 
:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("abc"); 

यह है कि मैं क्या लॉग में हो रही है

उत्तर

37

समस्या यह है कि Persistence.createEntityManagerFactory("abc") "इसे स्वयं करें" एपीआई है और एम्बेडेड ईजेबी कंटेनर का लाभ नहीं लेता है। आप अपने टेस्ट केस में एक कंटेनर EntityManager प्रबंधित कर सकते हैं।

जैसे संबंधित संबंधित जेडीआई/डेटासोर्स प्रश्न के साथ मैं आपको examples.zip में उदाहरणों की जांच करने की सलाह देता हूं। वे सब शुरू करने से संघर्ष करने के लिए तैयार किए गए हैं।

यहां testcase-injection उदाहरण से एक स्निपेट है जो दिखाता है कि आप एक एंटीटी मैनेजर और अन्य चीजों को एक परीक्षण में उपयोग के लिए कंटेनर से कैसे प्राप्त कर सकते हैं।

पहले, अपने परीक्षण कोड के लिए स्कैनिंग चालू करने के लिए अपने परीक्षण के लिए एक खाली EJB-jar.xml या अनुप्रयोग-client.xml जोड़ें:

  • src/परीक्षण/संसाधन/META-INF/आवेदन के client.xml

फिर, @org.apache.openejb.api.LocalClient के साथ अपने टेस्ट केस को एनोटेट करें और वास्तविक इंजेक्शन के लिए मानक जावाई एनोटेशन का उपयोग करें।

@LocalClient 
public class MoviesTest extends TestCase { 

    @EJB 
    private Movies movies; 

    @Resource 
    private UserTransaction userTransaction; 

    @PersistenceContext 
    private EntityManager entityManager; 

    public void setUp() throws Exception { 
     Properties p = new Properties(); 
     p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 
     p.put("movieDatabase", "new://Resource?type=DataSource"); 
     p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); 
     p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); 

     InitialContext initialContext = new InitialContext(p); 

     // Here's the fun part 
     initialContext.bind("inject", this); 
    } 

movieDatabase के रूप में केवल डेटा स्रोत है कि हम से सेट किया हुआ, OpenEJB स्वचालित रूप से आपके persistence.xml को संशोधित करने की आवश्यकता के बिना अपने हठ इकाई के लिए कि डेटा स्रोत प्रदान करेंगे है। आप <jta-data-source> या <non-jta-data-source> खाली भी छोड़ सकते हैं और ओपनईजेबी को अभी भी पता चलेगा कि क्या करना है।

लेकिन पूर्णता के लिए के लिए है, तो यहां इस विशेष आवेदन परीक्षण में persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 

    <persistence-unit name="movie-unit"> 
    <jta-data-source>movieDatabase</jta-data-source> 
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> 
    <class>org.superbiz.testinjection.Movie</class> 

    <properties> 
     <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

तो मज़ा हिस्सा परिभाषित किया गया है, यह सब का उपयोग कर एक साथ है

public void test() throws Exception { 

    userTransaction.begin(); 

    try { 
     entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); 
     entityManager.persist(new Movie("Joel Coen", "Fargo", 1996)); 
     entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998)); 

     List<Movie> list = movies.getMovies(); 
     assertEquals("List.size()", 3, list.size()); 

     for (Movie movie : list) { 
      movies.deleteMovie(movie); 
     } 

     assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); 

    } finally { 
     userTransaction.commit(); 
    } 
} 
संबंधित मुद्दे