मैं डेटाबेस के लिए एक वस्तु (ReportBean
) लागू करने के लिए चाहता था, लेकिन मैं त्रुटि संदेश मिला:कंटेनर प्रबंधित लेनदेन (सीएमटी) को कैसे कार्यान्वित करें?
javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)
यहाँ एक कोड का एक सा है:
इकाई
@Entity
@Table(name="t_report")
@Access(AccessType.FIELD)
public class ReportBean implements Serializable {
// fields (@Column, etc.)
// setters/getters methods
// toString , hashCode, equals methods
}
कस्टम एनोटेशन एंटीटीमैनेजर इंजेक्शन (@Inject
के साथ)
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Target;
@Qualifier
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyEm {
}
EntityManager प्रदाता
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
public class EntityManagerProvider {
private final String PERSISTENCE_UNIT = "MyPersistenceUnit";
@SuppressWarnings("unused")
@Produces
@MyEm
@PersistenceContext(unitName=PERSISTENCE_UNIT, type=PersistenceContextType.TRANSACTION)
private EntityManager em;
}
ValidateReportAction वर्ग - डेटाबेस के लिए रिपोर्ट लागू करने के लिए एक विधि है।
मैं सबसे महत्वपूर्ण आयात के साथ चिपकने की कोशिश कर रहा हूं।
यदि मैं कोई प्रश्न बनाने के लिए EntityManager
का उपयोग करना चाहता हूं (या उदाहरण के रूप में NamedQuery) सबकुछ काम करता है।
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.enterprise.context.SessionScoped;
@Named("validateReportAction")
@SessionScoped
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ValidateReportAction extends ReportAction implements Serializable {
private static final long serialVersionUID = -2456544897212149335L;
@Inject @MyEm
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public synchronized String createReport() {
ReportBean report = new Report();
// set report properties
// em.createNamedQuery("queryName").getResultList(); ---- works
em.persist(report)
}
}
Q
: यहाँ createReport()
विधि जब em.persist निष्पादित करता है, जहां त्रुटि दिखाई देते हैं। मैंने सोचा कि लेनदेन कंटेनर द्वारा प्रबंधित किया जाता है (CMT
), लेकिन अब मुझे लगता है कि मैं गलत हूं। मैंने गलती कहाँ की है? सीएमटी को लागू करने का सही तरीका क्या है?
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="MyPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/TimeReportDS</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<class>....</class>
<class>....</class>
<class>....</class>
<properties>
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/modelEntityManagerFactory" />
<!-- PostgreSQL Configuration File -->
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.password" value="password" />
<property name="hibernate.connection.url" value="jdbc:postgresql://192.168.2.125:5432/t_report" />
<property name="hibernate.connection.username" value="username" />
<!-- Specifying DB Driver, providing hibernate cfg lookup
and providing transaction manager configuration -->
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="hibernate.archive.autodetection" value="class" />
<!-- Useful configuration during development - developer can see structured SQL queries -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
कृपया मुझे बताएं कि मेरे सवाल में कुछ स्पष्ट नहीं है करते हैं:
यहाँ भी मेरी persistence.xml
विन्यास है।
एक और सही उत्तर, धन्यवाद! – nyxz
@ अरजन तिजम्स, क्या यह उत्तर अभी भी मान्य है? – Ced
@Ced Well, "@Transactional" अब एक अलग एनोटेशन के रूप में उपलब्ध है, इसलिए "अभी तक नहीं हुआ" अब हुआ है;) –