我有一个春季4应用程序,我试图从我的数据库中删除一个实体的实例。我有以下实体:删除不使用JpaRepository
@Entity
public class Token implements Serializable {
@Id
@SequenceGenerator(name = "seqToken", sequenceName = "SEQ_TOKEN", initialValue = 500, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqToken")
@Column(name = "TOKEN_ID", nullable = false, precision = 19, scale = 0)
private Long id;
@NotNull
@Column(name = "VALUE", unique = true)
private String value;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "USER_ACCOUNT_ID", nullable = false)
private UserAccount userAccount;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "EXPIRES", length = 11)
private Date expires;
...
// getters and setters omitted to keep it simple
}
我有一个JpaRepository接口定义:
public interface TokenRepository extends JpaRepository<Token, Long> {
Token findByValue(@Param("value") String value);
}
我有一个单元测试设置在存储器数据库(H2)与工作和我预填充带有两个令牌的数据库:
@Test
public void testDeleteToken() {
assertThat(tokenRepository.findAll().size(), is(2));
Token deleted = tokenRepository.findOne(1L);
tokenRepository.delete(deleted);
tokenRepository.flush();
assertThat(tokenRepository.findAll().size(), is(1));
}
第一个断言通过,第二个断言失败。我尝试了另一个测试,它改变了令牌值并将其保存到数据库中,并且确实可以工作,所以我不确定为什么delete不起作用。它不会抛出任何异常,只是不会将其保存到数据库中。它对我的oracle数据库也不起作用。
编辑
仍然有这个问题。我能加入这个我TokenRepository接口获取删除坚持到数据库:
@Modifying
@Query("delete from Token t where t.id = ?1")
void delete(Long entityId);
然而,这不是一个理想的解决方案。任何想法,我需要做什么才能使它没有这种额外的方法工作?
我不认为这是这里的问题,因为当我播种用测试数据测试,我指定ID为1 –