存储库save()不会将数据提交或持久化到表中,也不返回具有主键的对象,该对象已经在表中

时间:2019-02-12 21:16:43

标签: oracle hibernate spring-boot jpa

我正在编写JPA实现,以用查询替换JDBC实现。如代码所示,我已经在@SequenceGenerator中使用了Oracle数据库序列对象名称。结果,save()返回表中已经存在的数据,而不是生成新的主键并插入表中。 我认为该序列正在生成现有的主键,而不是生成新的主键。

 @Entity
 @Table(name = "table")
     public class TableDetail implements java.io.Serializable{
        @Id
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "table_seq")
        @SequenceGenerator(sequenceName = "SEQ_TABLE", allocationSize = 1, name = "table_seq")
        private Long AUDT_ID;
        ....
 }


 @Repository
 public interface TableDetailDAO extends CrudRepository<TableDetail, Long> {
       TableDetail save(TableDetail tableDetail);
 }


@Service
@Transactional
public class TableDetailServiceImpl implements TableDetailService {
    public void createAuditEvent(TableDetail tableDetail) {

       @Autowired
       TableDetailDAO tableDetailDAO;

       TableDetail tableDetail = 
   tableDetailDAO.save(tableDetail);
    }

}

1 个答案:

答案 0 :(得分:0)

所以我发现这是由于我的JDBC数据库配置文件定义了该TransactionManager的原因,如图所示。我必须删除它或在此方法中定义JpaTransactionManager。目前,此定义并未让JPA处理提交,因为该提交并未将数据持久化到数据库中。 之所以出现这个定义,是因为它实际上以前是JDBC的实现。

我还必须使用GenerationType.AUTO,因为据我所知,GenerationType.SEQUENCE仅在数据库中未定义Sequence对象时使用。

 /**
  * Creates a handle to the TransactionManager.
   *
   * @return PlatformTransactionManager
   */
  @Bean(name = "transactionManager")
    public PlatformTransactionManager txManager() {
    return new DataSourceTransactionManager(initializeDataSource());
  }