【问题标题】:em.merge() is not saving to the databaseem.merge() 未保存到数据库
【发布时间】:2014-08-21 07:37:51
【问题描述】:

我有类似这样的实体..

@Entity
@Table(name = "FIRST_ENTITY")
class FirstEntity
{
private static final Long serialVersionUid=1L;
@Id
@GeneratedValue
private Long id;
@Column(name="MESSAGE",nullable=false)
private String message;
}

还有一个用于此的 dao 类..

@Repository("myFirstDao")
class FirstDaoImpl implements FirstDao
{
@PersistenceContext(unitName="myUnit")
EntityManager em;

           public FirstEntity save(FirstEntity entity)
           {
           return em.merge(entity);
           }

}

以及服务类。

@Service("myFirstService")
public class MyFirstServiceImpl implements MyFirstService
{
@Resource(name="myFirstDao")
MyFirstDao myFirstDao;

           public FirstEntity save(FirstEntity entity)
           {
           return myFirstDao.save(entity);
           }
}

注意:实体管理器是容器管理的。

当我试图在另一个服务类中做这样的事情时..

@Service("anotherService")
public class AnotherServiceImpl
{

@Resource(name="myFirstService")
FirstService firstService;

      public void myMeth()
      {
      FirstEntity f=new FirstEntity();
      f.setMessage("Hello");

      FirstEntity f1=firstService.save(f);

      System.out.println("The generated id is "+f1);

      }
}

在这里,我得到了生成的 id,但实体没有存储到数据库中。 当我在FirstDaoImpl - save()中尝试这样做时@

em.getTransaction().begin();
em.save(entity);
em.getTransaction().commit();

我收到以下错误:Cannot call getTransaction() on a container managed bean

当我做这样的事情时..

em.save(entity);
em.flush();

我收到,没有交易正在进行错误。

我想知道,我该如何解决。提前致谢。希望您尽快回复。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我做了以下,它的工作。所需要的只是指定事务管理器的名称。当出现“未定义名为 transactionManager 的 bean”之类的错误时,很可能 transactionManager 将被命名为不同的名称。我之前没有注意到。

    事务管理器是在一个 xml 文件中定义的,该文件是我正在使用的框架的一部分(它存档在一个 jar 文件中,所以我无法知道事务管理器 bean 名称)。对于该 jar 中提供的预定义类,没有定义 @Transactional

    @Repository("myFirstDao")
    @Transactional(value="myTransactionManager")
    class FirstDaoImpl implements FirstDao
    {
    @PersistenceContext(unitName="myUnit")
    EntityManager em;
    
               @Transactional(value="myTransactionManager")
               public FirstEntity save(FirstEntity entity)
               {
               return em.merge(entity);
               }
    
    }
    

    感谢 @exabrial@ankur-singhal

    的宝贵回复

    【讨论】:

      【解决方案2】:

      使用 Spring 声明式事务管理可能是一个不错的选择,Spring 自行管理。还要检查事务边界,从哪里开始以及如何传播到服务/DAO 层。

      这可能对你有用

      http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-propagation

      【讨论】:

      • 但它是一个容器管理的,它有自己的事务管理器
      【解决方案3】:

      您应该使用声明式,而不是进行程序化事务管理。这意味着向您的服务添加另一个注释。我不确定您使用的是什么框架,但如果您使用的是 Spring,它可能是 @Transactional,或者如果您使用的是 EJB3,请添加 @TransactionAttribute(TransactionAttributeType.REQUIRED)。完成此操作后,取出这些行 em.getTransaction().begin();em.getTransaction().commit(); 您的容器现在应该为您启动/停止事务。容易多了!

      【讨论】:

      猜你喜欢
      • 2021-10-27
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多