在我的JSF2-JPA2-Spring3项目中,我可以插入新实体但不能删除实体。这是错误消息:java.lang.IllegalArgumentException异常:删除脱管的实例entity.Entity#8为什么JPA可以保存我的实体但它不能删除实体?
这是我的persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
http://java.sun.com/xml /ns/persistence/persistence_1_0.xsd” 版本= “1.0”>
<persistence-unit name="myPersistenceUnit"
transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
这是我的服务:
@Service("myService")
公共类MyServiceImpl实现为MyService {
@Resource(name="MyRepository")
MyDAO myDao;
@Transactional
public void deleteEntity(Entity entity) throws DAOException {
myDao.delete(entity);
}
这是我道:
@Repository("MyRepository")
公共类的UserDAO {
这是applicationContext.xml中:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
</bean>
</property>
<property name="dataSource" ref="myDataSource" />
<property name="persistenceUnitName" value="myPersistenceUnit"/>
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Throwable" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut=" execution(* service.*Service.*(..))"
advice-ref="transactionInterceptor" />
</aop:config>
我尝试从DAO使用这种方法喂列表中删除的实体:
public List<Entity> getAll() throws Exception {
List<Entity> list = null;
try {
list = entityManager.createQuery("Select e from Entity e").getResultList();
} catch (DataAccessException e) {
throw new Exception(e);
}
return list;
}
谢谢。但是当我这样做:entityManager.merge(entity); \t \t \t entityManager。除去(实体);同样的错误发生! – nazila
我清理了我的代码示例以使其更具可读性。再次阅读注释 - 您无法在实体上调用合并,然后移除该实体,您必须使用从merge()返回的实体。 –
谢谢。现在它工作正常,但是在这个配置中有没有任何方法所以我不必首先合并我的实体来对我的实体进行道操作?我觉得这不是最佳做法。 – nazila