Spring Hibernate JPA不在同一个表中保存多行

时间:2012-11-26 08:23:01

标签: spring jpa persistence

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

即使我执行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);

    }
      }

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

1 个答案:

答案 0 :(得分: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不可变,这通常优于可变对象。