我正在编写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);
}
}
答案 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());
}