У меня есть приложение spring 4, где я пытаюсь удалить экземпляр объекта из моей базы данных. У меня есть следующий объект:
@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);
}
У меня есть установка unit test, которая работает с базой данных в памяти (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));
}
Первое утверждение проходит, второе терпит неудачу. Я попробовал еще один тест, который изменяет значение токена и сохраняет его в базе данных, и он действительно работает, поэтому я не уверен, почему удаление не работает. Он также не бросает никаких исключений, просто не сохраняется в базе данных. Он также не работает против моей базы данных оракула.
Edit
Все еще проблема. Я смог получить удаление для сохранения базы данных, добавив это в мой интерфейс TokenRepository:
@Modifying
@Query("delete from Token t where t.id = ?1")
void delete(Long entityId);
Однако это не идеальное решение. Любые идеи относительно того, что мне нужно сделать, чтобы заставить его работать без этого дополнительного метода?