当前位置: 首页 > 知识库问答 >
问题:

JPA DAO模式未提交

仲孙宇定
2023-03-14

我在“独立Java SWING应用程序”中有下一个配置。我有一个问题:我的服务运行没有错误,执行DAO delete方法,但不提交delete:

坚持不懈xml

<persistence-unit name="springappPU" transaction-type="RESOURCE_LOCAL">
</persistence-unit>

Spring配置。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:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:tx="http://www.springframework.org/schema/tx"

   xsi:schemaLocation=" http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-      3.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

<context:annotation-config/>
<context:component-scan base-package="gestionclinicaecocitas">
</context:component-scan>
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- holding properties for database connectivity /-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username"  value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>


<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
<property name="persistenceUnitName" value="springappPU"></property>
</bean>

<bean id="jpaAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="${jpa.database}"
p:showSql="${jpa.showSql}"/>

在我的项目的main()中,初始化spring上下文,并获取一个“服务”加载程序类:

ClassPathXmlApplicationContext  ac= new ClassPathXmlApplicationContext("spring-config.xml");
ac.getBean(SpringServiceLoader.class);

我的SpringServiceLoader:

@Service
public class SpringServiceLoader{

    @Autowired
    private CalendarService calendarService;

标记为@Transactional的我的serviceInterface的方法

public interface CalendarioService {
@Transactional
    public void deleteDays();
}

服务调用dao-delete方法的实现

@Service("calendarService")
public class CalendarioServiceImpl implements CalendarioService{


@Autowired
private DaysDaoImpl daysDao;

@Override
public void deleteDays{
        daysDao.deleteById(1);
}

}

最后是Dao结构:

@Repository
public class DaysDaoImpl extends GenericDaoImpl< Days > {

public DaysDaoImpl(){
  setClazz(Days.class );
}

GenericDao类:

import java.io.Serializable;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public abstract class GenericDaoImpl< T extends Serializable> {//implements GenericDao<T>{

@PersistenceContext
protected EntityManager em;
private Class< T > clazz;


public void setClazz( Class< T > clazzToSet ){
   this.clazz = clazzToSet;
}

(.....)   

public void deleteById( Long entityId ){
    this.em.remove(this.em.getReference(clazz, entityId));

}
}

我的实体类:

@Entity
@Table(name="calendar_days")
public class Days implements java.io.Serializable {

@EmbeddedId
private DaysId id;

(....)

我还尝试了一个HQL查询,而不是调用一个基本的CRUD方法,我得到了错误:

执行更新/删除查询

 Query query = this.em
            .createQuery("delete from Days d where d.id.date < :fecha");
    query.setParameter("fecha", fecha);
    query.executeUpdate();

如果我尝试让em事务手动开始/提交,则错误将更改为:

不允许在共享EntityManager上创建事务

谢啦

共有3个答案

田翰林
2023-03-14

解决这个问题的一个非常简单的方法是将@Transactional添加到main()方法中。

蒋硕
2023-03-14

使用

T entity = em.find(persistentClass, id);

拿到那个实体然后打电话

em.remove(entity);

或者将此记录缩短一行。

更新(感谢@M.Deinum)

公良俊楚
2023-03-14

最后我找到了一个解决方案。标记为@Transactional的CalendarService接口有效,问题是SpringServiceLoader和CalendarService都定义为@Service。

我已将CalendarService重命名为@Component原型,该原型自动安装到标记为@Service原型的SpringServiceLoader,现在事务自动正常工作。

谢谢大家的支持!我会看看Spring数据

 类似资料:
  • 问题内容: 这有点奇怪。当我在线搜索此问题时,我看到许多页面的Google搜索结果和SO解决方案…但是似乎没有任何效果! 简而言之,我正在尝试实现AngularUI Bootstrap Modal。我不断收到以下错误: 错误:[$ injector:unpr]未知提供程序:$ uibModalInstanceProvider <-$ uibModalInstance <-addEntryCtrl

  • 我使用的是Xcode 4.5和iOS 6。 我正在构建一个使用故事板的通用应用程序。我有一个视图控制器,它在导航栏中有一个按钮。当点击按钮时,我正在使用一个segue来显示另一个视图控制器作为模式。模态视图控制器在其导航栏中有一个“取消”和一个“保存”按钮。在情节提要中,模式按钮项链接到新退出操作上的操作,该操作应展开到父视图控制器,取消模式,并调用操作处理程序。 这在iPhone上运行良好,但我

  • 我试图用django管道编译静态,但无法在开发模式下为静态服务。由于我不是Django开发人员,我可能对Django为静态文件本身提供服务的方式有所误解。这是我的项目结构: 项目(项目本身) css 应用程序。斯蒂尔 媒体 当我使用共享静态时,我已经指定了指令来允许Django dev server和命令查找共享静态: 这是我的: 在我的模板中,我指定了CSS组: 因此,生成这样的HTML: 但返

  • 我正在使用JAX-WS开发WebService(我在jaxws maven插件上使用wsimport目标)。我编写了一个导入XSD模式的WSDL。 此外,我还生成了web服务类,并创建了endpoint和all。到目前为止,一切都很顺利。当我在Tomcat7上运行服务时,一切都正常。我可以从以下位置访问浏览器中的wsdl: 但是我无法访问xsd模式。问题是在这个wsdl: 当然,在生成类的过程中,

  • 我有一个模态,它有一个形式。我试图提交表单而不使用ajax刷新页面,我成功地提交了表单,但我无法隐藏模态。 带表单的引导模式: 以上模式的Ajax代码: 在弹出Modal后,我在表单中提供了一个随机的支付卡详细信息,在我提交表单后,使用ajax post调用将详细信息发布到db中,并显示支付成功的警报。但是,我无法关闭模式。请解决这个问题??

  • 我使用Bulma作为我的CSS框架,在尝试使用它们的模态时,它们根本没有样式化,好像我遗漏了什么。 覆盖层就在那里,按钮似乎就位并且可见,但内容是灰色的。 我正在使用以下代码: Bulma的其他元素都在发挥作用。 注意:我不是在问JS部分,以及如何在Click上实际显示模态。我有纯粹的CSS问题。