سؤال

أنا جديد على EJB 3 و JPA.

لقد قمت بإنشاء مصدر بيانات في AppServer وهو jdbc/AppDataSource. يتم ترك مزود الثبات الافتراضي com.ibm.websphere.persistence.PersistenceProviderImpl. وتركت اسم JNDI Source Data Source الافتراضي AppDataSource بحد ذاتها. أنا في الواقع في حيرة من أمري بشأن JTA وغير JTA. ما الذي يميزهم؟

لقد أنشأت الكيانات وأنشأت EntityTransaction كائن في الفول. عند استدعاء persist() و commit() الطرق ، أحصل على خطأ:

javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.

كيف يأتي OpenJPA إلى الصورة هنا؟

اعتبارا من الآن ، بلدي persistence.xml يحتوي على أسماء فئة الكيان فقط.

كيف يمكنني جعله استخدام قيم AppServer الافتراضية لمصدر البيانات. وإلا كيف يمكنني تقديم تفاصيل موفر JPA وتفاصيل مصدر البيانات في persistence.xml?

يرجى تقديم مدخلاتك.

هل كانت مفيدة؟

المحلول

يتضمن هذا السؤال في الواقع العديد من المفاهيم ولن أغطيها جميعًا بالتفصيل. لمزيد من التفاصيل الشاملة ، أقترح قراءة الكل الفصل 5 - مديري الكيانات وسياقات الثبات من مواصفات JPA 1.0 (والأقسام الأخرى ذات الصلة المذكورة في نهاية هذه الإجابة). سأفضل أن أحاول وصف السيناريو الأكثر شيوعًا في بيئة Java EE.

ضمن بيئة EJB ، يمكن للمرء استخدامه عادة:

  • أ مدير كيان يدير الحاويات (يجب أن يكون مدير كيان JTA)
    • معاملة في حبوب الجلسة عديمة الجنسية (SLSB)
    • وسعوا في حبوب الجلسة الهادئة (SFSB)
  • إدارة معاملات JTA (وليس المعاملات المحلية للموارد ما لم يكن هذا حقًا ما تريد)

هنا هو كيف أ persistence.xml لمدير كيان JTA الذي يستخدم مصدر بيانات باسم JNDI java:comp/env/jdbc/AppDataSource يمكن إعداده ، OpenJPA كونه مزود الثبات الذي تستخدمه WebSphere:

<?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="MyPu" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>java:comp/env/jdbc/AppDataSource</jta-data-source>
    <class>com.acme.domain.Foo</class>
    <class>com.acme.domain.Bar</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <!-- OpenJPA specific properties -->
      <property name="openjpa.TransactionMode" value="managed"/>
      <property name="openjpa.ConnectionFactoryMode" value="managed"/>
      <property name="openjpa.jdbc.DBDictionary" value="db2"/>
    </properties>
  </persistence-unit>
</persistence>

لخصائص OpenJPA ، راجع OpenJPA توثيق.

وإليك كيف يمكن لـ SLSB (باستخدام المعاملات المدارة للحاويات) الحصول على مدير كيان يدير الحاويات:

@Stateless
public class EmployeeServiceBean implements EmployeeService {
    @PersistenceContext(unitName="MyPu")
    private EntityManager em;

    public Employee createEmployee(int id, String name, long salary) {
        Employee emp = new Employee(id);
        emp.setName(name);
        emp.setSalary(salary);
        em.persist(emp);
        return emp;
    }
    ...    
}

و هذا كل شيء. تتم إدارة دورة حياة مدير الكيان من قبل الحاوية بشفافية للتطبيق (لا يوجد CreateM/Close) ويشارك مدير الكيان في معاملة JTA التي تديرها الحاوية (لا توجد بداية/ملزمة صريحة).

كما تم التلميح سابقًا ، فأنا أخدش السطح فقط ، وهدفي هو أن أضعك بطريقة ما على الطريق الصحيح. للذهاب إلى أبعد من ذلك ، أقترح الاستيلاء على كتاب (على سبيل المثال ejb3 في العمل). وفي الوقت نفسه ، ستكون المراجع أدناه قراءة جيدة.

مراجع

  • مواصفات JPA 1.0
    • القسم 5.2.1 "الحصول على مدير كيان في بيئة Java EE"
    • القسم 5.5 "السيطرة على المعاملات"
    • القسم 5.6 "سياقات الثبات التي تديرها الحاويات"
    • القسم 6.2.1.2 "نوع المعاملة"
    • القسم 6.2.1.4 "مزود"
    • القسم 6.2.1.5 "JTA-DATA-SOURCE ، غير JTA-DATA-SOURCE"

موارد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top