使用Spring-data-jpa(外键)删除Postgresql中的相关记录

时间:2019-10-16 08:48:59

标签: postgresql spring-data-jpa enumeration

我有一个带有用户的表,该表的第一个字段是id。


@Entity
@Table(name = "usr")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

...

    @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    private Set<Role> roles;

}

有一个枚举列出了安全角色的类型。

public enum Role implements GrantedAuthority {
    USER, ADMIN;

    @Override
    public String getAuthority() {
        return name();
    }
}

id 表中的 usr 字段通过 user_role 中的外键链接>表格。

user_role 表没有任何实体,Hibernate根据**user**实体类中指定的注释自动创建键和具有角色的表。

我正在尝试删除**user**记录。


@Override
    @Transactional
    public void rollbackUserSave(User user) {

        Optional<User> byId = userRepository.findById(user.getId());

        User userForDelete = byId.orElse(null);

        deleteFromUser(userForDelete);
    }


    /** Удаление из таблицы usr данных*/
    private void deleteFromUser(User user) {

        if (user != null) {
            this.userRepository.delete(user);
        }
    }

但是删除不会发生,并且会出现相同的错误,并且在控制台中,我看不到有关删除失败的消息。

更新

现在可以了。我没有使用调试模式。

这是我的代码。

 public Optional<User> addUser(User user) {

        String username = user.getUsername();

        User userFromDb = userRepository.findByUsername(username);

        if (userFromDb != null) {
            return Optional.empty();
        }

        user.setActive(true);

        Set<Role> singleton = Collections.singleton(Role.USER);

        user.setRoles(singleton);

        String stringUuid = UUID.randomUUID().toString();
        user.setActivationCode(stringUuid);

        userRepository.save(user);

        if(sendMail(user)){
            User byUsername = this.userRepository.findByUsername(username);


            return Optional.ofNullable(byUsername);
        }

        return Optional.empty();

    }

    private boolean sendMail(User user) {

        String emailTo = user.getEmail();


        String username = user.getUsername();
        String activationCode = user.getActivationCode();

        String messageText = "Hello, %s! \n" +
                "Welcome to Sweater. Please, visit next link: http://localhost:8080/%s/activate/%s";

        String message = String.format(messageText, username, username, activationCode);

        boolean isSend = false;

         if (!emailTo.isEmpty()) {

            isSend = this.mailSender.send(emailTo, "Activation code", message);
        }

        if(!isSend && !emailTo.isEmpty()){
            rollbackUserSave(user);
        }

        return true;
    }


    @Override
    @Transactional
    public void rollbackUserSave(User user) {

        Optional<User> byId = userRepository.findById(user.getId());

        User userForDelete = byId.orElse(null);

        deleteFromUser(userForDelete);
    }


      private void deleteFromUser(User user) {

        if (user != null) {
            this.userRepository.delete(user);
        }
    }

有人可以解释发生了什么吗?谢谢。

0 个答案:

没有答案