My two entities have one to one relation
@Getter @Setter @Entity @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) @Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"), name = "library_user") public class AppUser { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) @EqualsAndHashCode.Exclude private Long id; // other fields @OneToOne(mappedBy="user", cascade={CascadeType.REMOVE,CascadeType.PERSIST}, orphanRemoval = true) private PasswordResetToken token; // getters/setters and equals/hashcode } @Getter @Setter @Entity @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) @Table(name = "password_reset_token") public class PasswordResetToken { private static final int EXPIRATION = 60 * 24; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; // other fields @OneToOne(targetEntity = AppUser.class, fetch = FetchType.EAGER, cascade={CascadeType.REMOVE,CascadeType.PERSIST}, orphanRemoval = true) @JoinColumn(nullable = false, name = "user_id") private AppUser user; // getters/setters and equals/hashcode
I tried to delete my user entity by this method
public void deleteUser(Long id) { resetTokenRepository.deleteAllByUserId(id); userRepository.deleteById(id); }
PasswordResetTokenRepository class which method I called in my service method, for deleting user I used regular hibernate method deleteById(Long id)
@Repository public interface PasswordResetTokenRepository extends JpaRepository<PasswordResetToken, Long> { void deleteAllByUserId(Long id); }
But when I try to delete by this method I got this error: not-null property references a null or transient value : kpi.diploma.ovcharenko.entity.user.PasswordResetToken.user I read several websites how to delete one to one relation, but their advices didn’t help me. For example, I tried a lot of variants of annotation cascade={CascadeType.ALL}, tried all the variants(CascadeType.REMOVE,CascadeType.PERSIST and so on), all time I got the same error. Help me pls, to understand what I do wrong.
Advertisement
Answer
try this:
@OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
Here is complete explication .