mercredi 22 mai 2019

How to solve HHH000346 Error using hibernate 5 and mysql?

I'm studying restful service and views. Regarding it, I use mysql and hibernate 5. My data tables are two and have reference relation. The problem occurs when I update the primary key. When I add new one then update existing data in another table (they have reference relation), HHH000346: Error during managed flush occurs.

I already search on google, but I couldn't find the answer.

This is my Entity classes.

@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;
    }
}

And this is class had problem.

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




Aucun commentaire:

Enregistrer un commentaire