mysql - 如何解决使用 hibernate 5 和 mysql 出现 HHH000346 错误?

标签 mysql spring hibernate web

我正在研究安心的服务和观点。 关于它,我使用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

最佳答案

你为什么这么做?

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

应该是:

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

我还建议您使用主键作为外键。 并且一个实体中不能有多个 @Id

关于mysql - 如何解决使用 hibernate 5 和 mysql 出现 HHH000346 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56253921/

相关文章:

php - mysqli 查询在 php 中将列名作为一行返回

php - 在事务中运行多个查询并分别处理输出

java - hql查询获取数据和金额总和

java - Hibernate : could not initialize proxy - no Session 中的 LazyInitializationException

java - Hibernate TABLE 未映射

mysql - 为什么使用游标的MySQL触发器只获取一个值

mysql - JOIN 语句中双嵌套派生表中的未知列

java - Spring Data JPA 在创建对象时保存多对多关系

Spring 集成 HTTP 到 Scatter Gather

java - 如何使不正确的切入点表达式抛出异常?