سؤال

ما هي القيمة التي يجب أن أضعها في <jta-data-source> من بلدي persistence.xml?

في لوحة مسؤول Glassfish ، قمت بإنشاء اسم مصدر بيانات "abcDS". في jndi.properties (داخل src/test/resources) لقد حددتها مثل هذا:

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

ماذا سأضع في persistence.xml؟ لقد وجدت الكثير من المتغيرات في الشبكة ، مثل: "jdbc/abcDS", "java:/abcDS", "abcDS". ايهم الاصح؟ وهل هناك بعض القاعدة لهذا؟ أنا أفهم أنه مرتبط بـ JNDI ، لكن ...

أحاول إنشاء EMF في اختبار الوحدة الخاص بي:

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

هذا ما أحصل عليه في السجل:

[...]
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)
[...]
هل كانت مفيدة؟

المحلول

المشكلة هي Persistence.createEntityManagerFactory("abc") هل واجهة برمجة تطبيقات "افعلها بنفسك" ولا تستفيد من حاوية EJB المضمنة. يمكنك الحصول على حاوية EntityManager في حالة الاختبار الخاصة بك بسهولة بالغة.

كما هو الحال مع سؤال JNDI/DataSource ذي الصلة ، أوصيك بمراجعة الأمثلة الواردة في أمثلة. جميعها مصممة لأخذ الصراع من البدء.

إليك مقتطف من testcase-injection مثال يوضح كيف يمكنك الحصول على intityManager وأشياء أخرى من الحاوية لاستخدامها في الاختبار.

أولاً ، أضف ejb-jar.xml فارغ أو تطبيق application-client.xml إلى الاختبار لتشغيل المسح للحصول على رمز الاختبار الخاص بك:

  • SRC/اختبار/الموارد/meta-inf/application-client.xml

ثم ، قم بتعليق حالة الاختبار الخاصة بك مع @org.apache.openejb.api.LocalClient واستخدم تعليقات Javaee القياسية للحقن الفعلي.

@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 تلقائيًا بتعيين بيانات البيانات هذه إلى وحدة الثبات الخاصة بك دون الحاجة إلى تعديل المثابرة. يمكنك حتى ترك <jta-data-source> أو <non-jta-data-source> الفارغ و Openejb لا يزال يعرف ماذا تفعل.

ولكن من أجل الاكتمال ، إليك كيفية تعريف هذا التطبيق بالذات 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();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top