স্প্রিং - বর্তমান থ্রেডের জন্য প্রকৃত লেনদেনের সাথে কোনও অ্যান্টিটি ম্যানেজার নেই - নির্ভরযোগ্যভাবে 'চালিয়ে যাওয়া' কলটি প্রক্রিয়া করতে পারে না


137

আমার স্প্রিং এমভিসি ওয়েব অ্যাপ্লিকেশনটিতে ডাটাবেসে সত্তা মডেলটি সংরক্ষণ করতে "অবিচলিত" পদ্ধতিটি চালানোর চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি। ইন্টারনেটে এমন কোনও পোস্ট বা পৃষ্ঠা পাওয়া যায় না যা এই বিশেষ ত্রুটির সাথে সম্পর্কিত হতে পারে। এটি অ্যান্টিটি ম্যানেজারফ্যাক্টরি শিমের সাথে কিছু ভুল বলে মনে হচ্ছে তবে আমি স্প্রিং প্রোগ্রামিংয়ে মোটামুটি নতুন তাই আমার কাছে মনে হচ্ছে সবকিছু সূক্ষ্মভাবে শুরু হয়েছে এবং ওয়েবে বিভিন্ন টিউটোরিয়াল নিবন্ধ অনুসারে।

ডেস্প্যাচার-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
 http://www.springframework.org/schema/mvc 
 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.0.xsd
  http://www.springframework.org/schema/jdbc
  http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
  http://www.springframework.org/schema/data/jpa
  http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
  http://www.springframework.org/schema/data/repository
  http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
  http://www.springframework.org/schema/jee
  http://www.springframework.org/schema/jee/spring-jee-3.2.xsd">

    <context:component-scan base-package="wymysl.Controllers" />
    <jpa:repositories base-package="wymysl.repositories"/> 
    <context:component-scan base-package="wymysl.beans" /> 
    <context:component-scan base-package="wymysl.Validators" /> 
    <bean
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
     <bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/>

     <bean id="passwordValidator" class="wymysl.Validators.PasswordValidator"></bean>

     <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
        <property name="username" value="system" />
        <property name="password" value="polskabieda1" />
    </bean>

 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:./META-INF/persistence.xml" />
    <property name="dataSource" ref="dataSource" />

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
            <property name="showSql" value="true" />
            <property name="generateDdl" value="false" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">10</prop>
        </props>
    </property>
</bean>

    <mvc:annotation-driven />

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
</bean>

    <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
             <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

    <mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:resources mapping="/resources/*" location="/resources/css/"  
    cache-period="31556926"/>



</beans>

RegisterController.java

@Controller
public class RegisterController {

    @PersistenceContext
    EntityManager entityManager;

    @Autowired
    PasswordValidator passwordValidator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.setValidator(passwordValidator);
    }

    @RequestMapping(value = "/addUser", method = RequestMethod.GET)
    public String register(Person person) {


        return "register";

    }

    @RequestMapping(value = "/addUser", method = RequestMethod.POST)
    public String register(@ModelAttribute("person") @Valid @Validated Person person, BindingResult result) {
        if(result.hasErrors()) {
            return "register";
        } else {
            entityManager.persist(person);
            return "index";

        }




    }

1
ত্রুটিটি যেমন বলে, কোনও লেনদেন নেই। সাথে রেজিস্টার পদ্ধতিতে টীকা দিন @Transaction
রোহিত

উত্তর:


260

আমারও একই সমস্যা ছিল এবং আমি সেই পদ্ধতিটি টিকিয়ে দিয়েছিলাম @Transactionalএবং এটি কাজ করে।

আপডেট: বসন্তের ডকুমেন্টেশনগুলি পরীক্ষা করে দেখে মনে হয় ডিফল্টরূপে পার্সিস্টি কনটেক্সট হ'ল লেনদেনের ধরণ, সুতরাং সে কারণেই পদ্ধতিটি লেনদেনের হতে হবে ( http://docs.spring.io/spring/docs/current/spring-framework-references/ এইচটিএমএল / orm.html ):

@ পার্সিস্টিস্ট কনটেক্সট টীকাটিতে একটি alচ্ছিক বৈশিষ্ট্য প্রকার রয়েছে, যা পার্সিস্টিস্টনকন্টেক্সটটাইপ.ট্রান্সঅ্যাকশনকে ডিফল্ট করে। এই ডিফল্টটি আপনাকে ভাগ করা অ্যান্টিটি ম্যানেজার প্রক্সিটি পেতে হবে। পার্সিস্টিস্টনটেক্সটটাইপ.অেক্সটেন্ডযুক্ত বিকল্পটি সম্পূর্ণ ভিন্ন বিষয়: এটি একটি তথাকথিত বর্ধিত অ্যান্টিটি ম্যানেজারের ফলস্বরূপ, যা থ্রেড-নিরাপদ নয় এবং সুতরাং এটি একটি স্প্রিং-ম্যানেজড সিঙ্গলটন শিমের মতো একযোগে অ্যাক্সেস করা উপাদানগুলিতে ব্যবহার করা উচিত নয়। বর্ধিত সত্তা ম্যানেজারগুলি কেবলমাত্র রাষ্ট্রীয় উপাদানগুলিতে ব্যবহার করা হবে বলে মনে করা হয়, উদাহরণস্বরূপ, সেশনে অবস্থান করা, সত্তা ম্যানেজারের জীবনচক্রটি বর্তমান লেনদেনের সাথে আবদ্ধ না হয়ে বরং পুরোপুরি অ্যাপ্লিকেশন অবধি চলে।


71
যদি ঘোষণা ছাড়াই @Transactionalকোনও পদ্ধতি @Transactionalএকই ক্লাসফাইলে টীকা সহ একটি পদ্ধতি কল করে, আপনিও এই ত্রুটি দ্বারা আক্রান্ত হবেন (এটিই আমি সম্মুখীন হয়েছি)।
জ্যাকব ভ্যান লিনজেন

5
আমি পরিষেবা ক্লাসটি দিয়ে এ্যানোটেট করেছিলাম @Transactional, এটিও কাজ করে। এটি সঠিক পথে যাওয়ার বিষয়ে নিশ্চিত না তবে এটি মনে হচ্ছে এটি
ঠিকঠাক

8
আরেকটি বিষয় উল্লেখযোগ্য যে হ'ল এই টিকাটি জনসাধারণের পদ্ধতির জন্য ব্যবহার করা উচিত কারণ এটি অন্যথায় কাজ করে না।
ইউরি ক্রেভেটস

7
মনে রাখবেন, দয়া করে, @ লেনদেনটি কেবল সর্বজনীন পদ্ধতিতে কাজ করে।
Andrei_N

7
এফওয়াইআই এর জন্য জাভ্যাক্স.ট্রান্সজেকশন দরকার rans ট্রানজেকশনাল টিকা (স্প্রিং নয়)।
java-addict301

85

বসন্তের ডেটা সংগ্রহস্থলে একটি মুছুনে কাস্টম পদ্ধতি ব্যবহার করার চেষ্টা করার সময় আমি এই ব্যতিক্রম পেয়েছি। অপারেশনটি একটি ইউনাইট পরীক্ষার ক্লাস থেকে চেষ্টা করা হয়েছিল।

@TransactionalJUnit শ্রেণির স্তরে টিকাটি ব্যবহার করে ব্যতিক্রম ঘটে না ।


8
আমি একই পরিস্থিতিতে ছিলাম, পরীক্ষার-শ্রেণীর পরিবর্তে আমি পরিষেবা পদ্ধতিটি উল্লেখ করেছিলাম তাই এটি পরীক্ষা না হলেও তা কমে গেছে।
পল নেলসন বাকের

@Transactionalশ্রেণি-স্তরের আপনার পরীক্ষাগুলিতে আপনার সমস্যার বিভিন্ন লেনদেনের কৌশল পরীক্ষা করতে পারে test
জোন

1
আমি @Trasactionalসংগ্রহস্থল পদ্ধতিতে এটি ব্যবহার করেছি যেখানে আমি প্রকৃতপক্ষে ডেটাবেস এবং এর কাজ সূক্ষ্মের সাথে ইন্টারঅ্যাক্ট করছি।
হরিশ কুমার সায়নী

22

এই ত্রুটিটি আমাকে তিন দিনের জন্য শিয়াল করে রেখেছে, যে পরিস্থিতির মুখোমুখি হয়েছিলাম একই ত্রুটি ঘটেছে produced আমি যে সমস্ত পরামর্শ পেয়েছি তা অনুসরণ করে, আমি কনফিগারেশনের সাথে খেলেছি কিন্তু কোন ফলসই হয়নি।

অবশেষে আমি এটি খুঁজে পেলাম, পার্থক্যটি, আমি যে পরিষেবাটি চালাচ্ছিলাম সেটি একটি সাধারণ জারে ছিল, সমস্যাটি এসপেক্টজে পরিণত হয়েছিল যে পরিষেবা ইনস্ট্যানটিশনের সাথে একই আচরণ করে না। প্রকৃতপক্ষে প্রক্সিটি সমস্ত সাধারণ স্প্রিং ম্যাজিকটি পদ্ধতি কল করার আগে সম্পাদন করা ছাড়াই কেবল অন্তর্নিহিত পদ্ধতিটিকে কল করছিল।

শেষ পর্যন্ত সার্ভিসের উপর দেওয়া @Scope টিকাটি উদাহরণ অনুসারে সমস্যাটি সমাধান করেছে:

@Service
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
@Transactional
public class CoreServiceImpl implements CoreService {
    @PersistenceContext
    protected EntityManager entityManager;

    @Override
    public final <T extends AbstractEntity> int deleteAll(Class<T> clazz) {
        CriteriaDelete<T> criteriaDelete = entityManager.getCriteriaBuilder().createCriteriaDelete(clazz);
        criteriaDelete.from(clazz);
        return entityManager.createQuery(criteriaDelete).executeUpdate();
    }

}

আমি পোস্ট করা পদ্ধতিটি মুছে ফেলা পদ্ধতি তবে টীকাগুলি একইভাবে সমস্ত দৃistence়তা পদ্ধতির উপর প্রভাব ফেলে।

আমি আশা করি যে পোস্টটি কোনও জার থেকে কোনও পরিষেবা লোড করার সময় একই সমস্যার সাথে লড়াই করা অন্য কাউকে সহায়তা করেছে


যোগ করার পদ্ধতি @Scope(proxyMode = ScopedProxyMode.INTERFACES)দাও বর্গ যা ইন্টারফেস প্রয়োগ করার সত্যিই গুরুত্বপূর্ণ। আমি পুরো দিনটি এই ত্রুটিটি সনাক্ত করার জন্য ব্যয় করেছি এবং আপনার সমাধানটি কেবলমাত্র একটি কাজ করে। আপনাকে অনেক ধন্যবাদ!
থাচ ভ্যান

1
আপনার উত্তর থেকে একটি এল-নোটেশন আমাকে সবেমাত্র প্রায় 3 দিন বাঁচিয়েছে। আমি সবেমাত্র এডেনেমার আসল শক্তিটি অনুভব করেছি। Дякс।
ওলেকসেই ক্যাস্লিয়েটসিন

11

আমার একই ত্রুটি হয়েছিল কারণ আমি এক্সএমএল থেকে জাভা-কনফিগারেশনে স্যুইচ করেছি।

মুল <tx:annotation-driven/>বক্তব্যটি হ'ল, আমি ট্যাগটি স্থানান্তর করিনি , স্টোন ফেংয়ের পরামর্শ অনুসারে।

সুতরাং আমি @EnableTransactionManagementএখানে পরামর্শ হিসাবে ঠিক যুক্ত করেছি @ কনফিগারেশন ক্লাসে বসন্তে টিকা চালিত লেনদেনগুলি সেট আপ , এবং এটি এখন কাজ করে


8

boardRepo.deleteByBoardId (ID);

একই সমস্যার মুখোমুখি। নিয়েই javax.persistence.TransactionRequiredException: প্রকৃত লেনদেনের সহ কোনো EntityManager বর্তমান থ্রেড জন্য উপলব্ধ

আমি এটি নিয়ন্ত্রক / পরিষেবার উপরে @ লেনদেনের টীকা যুক্ত করে সমাধান করেছি ।


7

আমি একই সমস্যা ছিল এবং আমি যোগ tx:annotation-drivenমধ্যে applicationContext.xmlএবং এটা কাজ করে।


4

ইতিমধ্যে একই উপাদানটির মধ্যে একটি অ-লেনদেন পদ্ধতিতে ইতিমধ্যে লেনদেন-অ্যানোটেটেড পদ্ধতিতে অ্যাক্সেস করার সময় আমার একই ত্রুটি হয়েছিল:

Before:
    @Component
    public class MarketObserver {
        @PersistenceContext(unitName = "maindb")
        private EntityManager em;

        @Transactional(value = "txMain", propagation = Propagation.REQUIRES_NEW)
        public void executeQuery() {
          em.persist(....);
        }


        @Async
        public void startObserving() {
          executeQuery(); //<-- Wrong
        }
    }

    //In another bean:
     marketObserver.startObserving();

আমি স্ব-রেফারেন্সযুক্ত উপাদানটিতে এক্সিকিউটিকিউয়ের () কল করে ত্রুটিটি স্থির করেছি:

Fixed version:
    @Component
    public class MarketObserver {
        @PersistenceContext(unitName = "maindb")
        private EntityManager em;

        @Autowired
        private GenericApplicationContext context;

        @Transactional(value = "txMain", propagation = Propagation.REQUIRES_NEW)
        public void executeQuery() {
          em.persist(....);
        }


        @Async
        public void startObserving() {
          context.getBean(MarketObserver.class).executeQuery(); //<-- Works
        }
    }

3

যোগ করার পদ্ধতি org.springframework.transaction.annotation.Transactionalপরীক্ষা বর্গ জন্য বর্গ পর্যায়ে টীকা আমার জন্য সমস্যা সমাধান করা হয়েছে।


3

অন্যান্য ত্রুটির জন্য উত্তরগুলি খুঁজতে অন্য ব্যবহারকারীদের জন্য কেবল একটি নোট । আর একটি সাধারণ সমস্যা হ'ল:

আপনি @transactionalএকই ক্লাসের মধ্যে থেকে কোনও পদ্ধতিতে কল করতে পারেন না ।

(AspectJ ব্যবহার করার উপায় এবং উপায় রয়েছে তবে রিফ্যাক্টরিং সহজতর হবে)

সুতরাং আপনার একটি কলিং ক্লাস এবং ক্লাস দরকার যা @transactionalপদ্ধতিগুলি ধারণ করে ।


2

আমাদের জন্য, সমস্যাটি একাধিক কনফিগারেশন ফাইলগুলিতে একই প্রসঙ্গের সেটিংসে নেমে এসেছে। আপনি নিম্নলিখিতটি একাধিক কনফিগারেশনের ফাইলগুলিতে নকল করেছেন কিনা তা পরীক্ষা করে দেখুন।

<context:property-placeholder location="classpath*:/module.properties"/>
<context:component-scan base-package="...." />

2

আমি যখন @Transactionকোনও ভুল পদ্ধতি / অ্যাকশনলেভেল ব্যবহার করতাম তখন আমার একই ত্রুটি কোডটি ছিল ।

methodWithANumberOfDatabaseActions() { 
   methodA( ...)
   methodA( ...)
}

@Transactional
void methodA( ...) {
  ... ERROR message
}

অবশ্যই আমাকে অবশ্যই @Transactionalপদ্ধতির ঠিক উপরে রাখতে হয়েছিল methodWithANumberOfDatabaseActions()

এটি আমার ক্ষেত্রে ত্রুটির বার্তাটি সমাধান করেছে।


0

আমি মোডটি সরিয়ে দিয়েছি

<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager" />

এই কাজ করতে


0

আমার বেশ কয়েকদিন ধরে এই সমস্যা ছিল এবং আমি অনলাইনে কোথাও খুঁজে পাইনি কিছুই আমাকে সহায়তা করেছিল, অন্য কারও সাহায্য করার ক্ষেত্রে আমি আমার উত্তর এখানে পোস্ট করছি।

আমার ক্ষেত্রে, আমি রিমোটিংয়ের মাধ্যমে কল করা একটি মাইক্রোসার্ভাইস নিয়ে কাজ করছিলাম, এবং পরিষেবা স্তরে আমার @ ট্রানজেকশনাল টিকাটি দূরবর্তী প্রক্সি দ্বারা নেওয়া হয়নি।

পরিষেবা এবং দাও স্তরগুলির মধ্যে একটি প্রতিনিধি শ্রেণি যুক্ত করা এবং ডেলিগেট পদ্ধতিটি লেনদেন হিসাবে চিহ্নিত করা আমার জন্য এটি স্থির করে।


0

এটি আমাদের সহায়তা করেছিল, সম্ভবত এটি ভবিষ্যতে অন্যকে সহায়তা করতে পারে। @Transactionআমাদের জন্য কাজ করে না, তবে এটি করেছে:

@ConditionalOnMissingClass("org.springframework.orm.jpa.JpaTransactionManager")


0

যদি তোমার থাকে

@Transactional // Spring Transactional
class MyDao extends Dao {
}

এবং সুপার-ক্লাস

class Dao {
    public void save(Entity entity) { getEntityManager().merge(entity); }
}

এবং আপনি কল

@Autowired MyDao myDao;
myDao.save(entity);

আপনি একটি স্প্রিং ট্রানজেকশনস ইন্টারসেপ্টর পাবেন না (এটি আপনাকে একটি লেনদেন দেয়)।

এটি আপনার করা দরকার:

@Transactional 
class MyDao extends Dao {
    public void save(Entity entity) { super.save(entity); }
}

অবিশ্বাস্য হলেও সত্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.