Как решить HHH000346 Ошибка с использованием Hibernate 5 и MySQL? - PullRequest
0 голосов
/ 22 мая 2019

Я изучаю спокойный сервис и взгляды. Что касается этого, я использую mysql и hibernate 5. Мои таблицы данных две и имеют отношение ссылки. Проблема возникает, когда я обновляю первичный ключ. Когда я добавляю новый, затем обновляю существующие данные в другой таблице (они имеют отношение ссылок), HHH000346: Произошла ошибка во время управляемого сброса.

Я уже ищу в Google, но не могу найти ответ.

Это мои классы сущностей.

@Entity
@Table(name = "users")
@EntityListeners(AuditingEntityListener.class)
public class User {
    private long serial;
    private String username;
    private String password;

    public User() {

    }

    public User(long serial, String username, String password) {
        setSerial(serial);
        setUsername(username);
        setPassword(password);
    }

    @Column(name = "serial", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getSerial() {
        return serial;
    }

    public void setSerial(long serial) {
        this.serial = serial;
    }

    @Id
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "password", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "serial: " + this.serial + ", username: " + this.username + ", password: " + this.password; 
    }
}
Entity
@Table(name = "sites")
@EntityListeners(AuditingEntityListener.class)
@IdClass(Site.class)
public class Site implements Serializable{
    @ManyToOne
    @JoinColumn(name="username",foreignKey=@ForeignKey(name="username"))
    private String username;
    private String siteURL;

    @Id
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Id
    public String getSiteURL() {
        return siteURL;
    }

    public void setSiteURL(String siteName) {
        this.siteURL = siteName;
    }
}

И у этого класса были проблемы.

public class UserController {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private SiteRepository siteRepository;
    private CryptoUtil passwordEncoder = new CryptoUtil();

    ...

    @PutMapping("/users/{username}")
    public User updateUser(@PathVariable(value = "username") String username, @Valid @RequestBody User userDetails)
            throws ResourceNotFoundException {
        User user = userRepository.findById(username)
                .orElseThrow(() -> new ResourceNotFoundException("User not found on :: " + username));
        List<Site> sites = siteRepository.findByUsername(user.getUsername());

        userDetails.setPassword(passwordEncoder.encryptSHA256(userDetails.getPassword()));
        final User updateUser = userRepository.save(userDetails);

        for (Site site : sites)
        {
            site.setUsername(userDetails.getUsername());
            site = siteRepository.save(site);
        }

        userRepository.delete(user);
        return updateUser;
    }

    ....
}
The for-each statement occurs error.

PLEASE HELP ME

1 Ответ

0 голосов
/ 22 мая 2019

Почему ты это сделал?

@ManyToOne
@JoinColumn(name="username",foreignKey=@ForeignKey(name="username"))
private String username;

Это должно быть:

@ManyToOne
@JoinColumn(name="username",foreignKey=@ForeignKey(name="username"))
private User user;

Я также предлагаю вам использовать первичный ключ в качестве внешнего ключа.И вы не можете иметь несколько @Id в сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...