Ich habe eine Spring 4-App, in der ich versuche, eine Instanz einer Entität aus meiner Datenbank zu löschen. Ich habe die folgende Entität:
@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
}
Ich habe eine JpaRepository-Schnittstelle definiert:
public interface TokenRepository extends JpaRepository<Token, Long> {
Token findByValue(@Param("value") String value);
}
Ich habe ein Unit-Test-Setup, das mit einer In-Memory-Datenbank (H2) funktioniert, und fülle die Datenbank mit zwei Token vor:
@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));
}
Die erste Behauptung ist erfolgreich, die zweite fehlgeschlagen. Ich habe einen anderen Test versucht, der den Token-Wert ändert und in der Datenbank speichert, und er funktioniert tatsächlich. Daher bin ich mir nicht sicher, warum das Löschen nicht funktioniert. Es werden auch keine Ausnahmen ausgelöst, sondern nur nicht in der Datenbank gespeichert. Es funktioniert auch nicht gegen meine Oracle-Datenbank.
Bearbeiten
Ich habe immer noch dieses Problem. Ich konnte das Löschen in der Datenbank beibehalten, indem ich dies zu meiner TokenRepository-Oberfläche hinzufügte:
@Modifying
@Query("delete from Token t where t.id = ?1")
void delete(Long entityId);
Dies ist jedoch keine ideale Lösung. Irgendwelche Ideen, was ich tun muss, damit es ohne diese zusätzliche Methode funktioniert?