【问题标题】:Spring Hibernate JPA not saving multiple rows in a same tableSpring Hibernate JPA不在同一个表中保存多行
【发布时间】:2012-11-26 08:23:00
【问题描述】:

我正在处理用户可以向多个人发送消息的要求,我必须将这些消息保存在消息表中。
我使用 JPA entityManager 来持久化对象,使用 Hibernate 作为持久性提供者和 Spring 声明式事务管理。

即使我执行了 3 次 persist() 方法,它也只在表中保存了一行。我不知道该怎么做才能保存所有消息。它没有显示任何异常消息。

以下是我在 applicationContext.xml 中的声明式事务管理配置

  <tx:advice id="txAdvice" >

    <tx:attributes>

        <tx:method
            name="*"
            propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>

    <aop:pointcut
        id="messageServiceOperation"
        expression="execution(* com.abhinow.message.services.*.*(..))" />

    <aop:advisor
        advice-ref="txAdvice"
        pointcut-ref="messageServiceOperation" />
</aop:config>

以下是我的服务类 MessageService.java 中的代码

  private void saveMultipleMessages(SentMessage message) {
    String[] toAddresses = message.getMultipleDestinations().split(",");
    for(String to: toAddresses) {
        message.setTo(to);
    saveMessage(message);
    }
}

public void saveMessage(SentMessage message) {
    messageRepository.saveSentMessage(message);
}

以下是我的 MessageRepository.java 中的代码

  @Repository
  public class MessageRepository {

   @PersistenceContext
   EntityManager entityManagerFactory;

   public void saveSentMessage(SentMessage message) {

    entityManagerFactory.persist(message);

    }
      }

任何帮助将不胜感激。提前致谢

【问题讨论】:

    标签: spring jpa persistence


    【解决方案1】:

    看起来您在 for 循环中重复使用了相同的 SentMessage 对象。我的猜测是 JPA 会检测到它已经持久化了这个对象并且不会再持久化它。

    试试这样的:

    private void saveMultipleMessages(SentMessage message) {
        String[] toAddresses = message.getMultipleDestinations().split(",");
        for(String to: toAddresses) {
            SentMessage toSave = message.withToAddress(to);
            saveMessage(toSave);
        }
    }
    

    其中“withToAddress”基于当前对象创建一个新的 SentMessage 对象,但地址不同。当您使用这种技术时,您可以使 SentMessage 不可变,这通常比可变对象具有优势。

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2018-12-02
      • 2020-08-16
      相关资源
      最近更新 更多