Skip to content
Advertisement

Deleting an entity with one to one relation

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 .

Advertisement