2010-10-29 31 views
29

Tôi nên đặt giá trị nào vào <jta-data-source> trong số persistence.xml của mình?Điều gì để đưa vào nguồn dữ liệu jta-persistence.xml?

Trong bảng điều khiển quản trị thủy tinh, tôi đã tạo tên nguồn dữ liệu "abcDS". Trong tôi jndi.properties (bên src/test/resources) Tôi định nghĩa nó như thế này:

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

tôi sẽ đặt gì vào persistence.xml? Tôi đã tìm thấy rất nhiều biến thể trong Mạng, như: "jdbc/abcDS", "java:/abcDS", "abcDS". Cái nào là đúng? Và có một số quy tắc cho điều này? Tôi hiểu rằng nó liên quan đến JNDI, nhưng ...

Tôi đang cố gắng để tạo ra EMF trong thử nghiệm đơn vị của tôi:

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

Đây là những gì tôi nhận được trong nhật ký:

[...] 
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) 
[...] 

Trả lời

37

Vấn đề là Persistence.createEntityManagerFactory("abc") là API "tự mình làm" và không tận dụng được Vùng chứa EJB được nhúng. Bạn có thể nhận được một container được quản lý EntityManager trong trường hợp kiểm tra của bạn rất dễ dàng.

Giống như câu hỏi jndi/datasource liên quan Tôi khuyên bạn nên xem các ví dụ trong số examples.zip. Tất cả chúng đều được thiết kế để bắt đầu cuộc đấu tranh.

Dưới đây là một đoạn trích từ ví dụ testcase-injection cho biết cách bạn có thể lấy EntityManager và các thứ khác từ vùng chứa để sử dụng trong thử nghiệm.

Đầu tiên, thêm một sản phẩm nào ejb-jar.xml hoặc ứng dụng client.xml để thử nghiệm của bạn để bật quét mã kiểm tra của bạn:

  • src/kiểm tra/nguồn/META-INF/dành cho ứng dụng client.xml

Sau đó, chú thích trường hợp thử nghiệm của bạn với @org.apache.openejb.api.LocalClient và sử dụng chú thích JavaEE tiêu chuẩn cho việc tiêm thực tế.

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

Như movieDatabase là DataSource duy nhất mà chúng tôi đã thiết lập, OpenEJB sẽ tự động gán DataSource để đơn vị kiên trì của bạn mà không cần phải sửa đổi persistence.xml của bạn. Bạn thậm chí có thể để trống <jta-data-source> hoặc <non-jta-data-source> trống và OpenEJB sẽ vẫn biết phải làm gì.

Nhưng vì lợi ích của sự hoàn chỉnh, dưới đây là cách ứng dụng cụ thể này đã xác định các 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> 

Sau đó, phần thú vị, sử dụng nó tất cả cùng nhau trong các thử nghiệm

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(); 
    } 
} 
Các vấn đề liên quan