2015-09-14 3 views
11

में जेपीए का उपयोग करके इकाई को सहेज/अपडेट नहीं कर सकता है, मैं अपने एप्लिकेशन में जेपीए का उपयोग कर रहा हूं, और ऑब्जेक्ट्स के लिए पूछताछ करने के बाद यह काम करता है, हालांकि जब मैंने ऑब्जेक्ट को सहेजने या अपडेट करने का प्रयास किया तो यह javax.persistence.TransactionRequiredException: No transactional EntityManager available त्रुटि फेंक देता है। मैं @EnableTransactionManagement में proxyTargetClass = true उपयोग करते हैं, के बाद से मैं अपने आवेदन में बेकार इंटरफेस बनाने के लिए नहीं करना चाहतीवसंत

@Configuration 
@EnableTransactionManagement(proxyTargetClass = true) 
@PropertySource("classpath:dao.properties") 
public class JpaConfig { 
    @Autowired 
    private Environment env; 
    @Bean 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     ..................... 
     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     Properties jpaProperties = new Properties(); 
     jpaProperties.put("hibernate.dialect", ...........) 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     entityManagerFactoryBean.setJpaProperties(jpaProperties); 
     entityManagerFactoryBean.setPackagesToScan("com...."); 
     return entityManagerFactoryBean; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 
     return transactionManager; 
    } 
} 

नोट:

यह जावा विन्यास है।

@Transactional 
@Repository 
public abstract class AbstractJPADao<I, E> { 
    @Autowired 
    @PersistenceContext 
    protected EntityManager entityManager; 

    private Class<E> type; 
    public AbstractJPADao() { 
     type=.... 
    } 

    @Override 
    public Result<E> find(I id) { 
     E e = entityManager.find(type, id); 
     return Result.newInstance().setContent(e); 
    } 

    @Override 
    public Result<E> find(Map<String, Object> condition) { 
     Query q = entityManager.createQuery(".......)); 
     return Result.newInstance().setContent(q.getResultList()); 
    } 

    @Override 
    public E save(E element) { 
     entityManager.persist(element); 
     return element; 
    } 
    @Override 
    public E update(E element) { 
     entityManager.merge(element); 
     return element; 
    } 

    @Override 
    public void delete(E element) { 
     entityManager.remove(element); 
    } 
} 

@Repository 
@Transactional 
public class DepartmentDao extends AbstractJPADao<String, Department> { 
    @Override 
    protected String selectCause(Map<String, Object> condition) { 
     return ""; 
    } 
} 

और दाव के ग्राहक के रूप में नियंत्रक:

@Controller 
@RequestMapping("/api/deps") 
public class DepartmentCtrl { 
    @Autowired 
    private DepartmentDao departmentDao; 
    @RequestMapping(value = "", method = RequestMethod.POST) 
    public Result create(@Valid Department department, BindingResult bindingResult) { 
     if (!bindingResult.hasErrors()) { 
      departmentDao.save(department); 
      return Result.newInstance().setContent(department); 
     } 
     throw new RuntimeException("..."); 
    } 
} 

वहाँ कुछ भी गलत है

और इस दाव की ठोस अंतर्गत प्रयोग किया है?


dao.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/proj 
jdbc.username=root 
jdbc.password= 

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
hibernate.hbm2ddl.auto=update 
#hibernate.ejb.naming_strategy=true 
hibernate.show_sql=true 
hibernate.format_sql=true 
+1

'सार तत्व जेपीएडीओ' में 'एंटीटीमेनगर 'प्रकार के' संरक्षित 'फ़ील्ड पर' @ ऑटोवायर' और '@ पर्सिस्टेंस कॉन्टेक्स्ट' दो एनोटेशन क्यों हैं? – Tiny

+0

'EntityManager'' JpaConfig' में एक बीन के रूप में प्रदान किया जाता है जिसे 'सारजेपाडाओ' से इंजेक्शन दिया जाना चाहिए। – hguser

+0

आप किस कंटेनर में चल रहे हैं? –

उत्तर

4

वर्ग JpaConfig

Autowiring नाम से भी जाना जाता में txManager को विधि transactionManager का नाम बदलें txManager

संपादित करें

इसके अलावा ढांचे को txManager के लिए कोई तर्क विधि की उम्मीद नहीं की जा सकती है। आप के लिए

@Bean 
public PlatformTransactionManager transactionManager() { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
    return transactionManager; 
} 
+0

यह काम नहीं करता है। – hguser

+0

@hguser मेरा जवाब संपादित किया गया। क्या आप कोशिश कर सकते हैं? – gipsy

+0

धन्यवाद, मैंने कोशिश की है: विधि में तर्कों को हटाएं, और विधि नाम के रूप में 'लेन-देन प्रबंधक' और 'txManager' दोनों का उपयोग करें। उनमें से कोई भी काम नहीं करता है। :( – hguser

1

के रूप में छोटे देखा बदलने का प्रयास कर सकते हैं, तो आप AbstractJPADao में टाइप EntityManager के संरक्षित क्षेत्र पर दो एनोटेशन @Autowired है और @PersistenceContext। @Autowired को हटाने का प्रयास करें। @PersistenceContext EntityManager इंजेक्ट करने के लिए पर्याप्त है।

+0

इसे ठीक नहीं करता है। – hguser