में जेपीए का उपयोग करके इकाई को सहेज/अपडेट नहीं कर सकता है, मैं अपने एप्लिकेशन में जेपीए का उपयोग कर रहा हूं, और ऑब्जेक्ट्स के लिए पूछताछ करने के बाद यह काम करता है, हालांकि जब मैंने ऑब्जेक्ट को सहेजने या अपडेट करने का प्रयास किया तो यह 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
'सार तत्व जेपीएडीओ' में 'एंटीटीमेनगर 'प्रकार के' संरक्षित 'फ़ील्ड पर' @ ऑटोवायर' और '@ पर्सिस्टेंस कॉन्टेक्स्ट' दो एनोटेशन क्यों हैं? – Tiny
'EntityManager'' JpaConfig' में एक बीन के रूप में प्रदान किया जाता है जिसे 'सारजेपाडाओ' से इंजेक्शन दिया जाना चाहिए। – hguser
आप किस कंटेनर में चल रहे हैं? –