繁体   English   中英

保存实体时从属集合重复

[英]Dependent collection duplicates when I save entity

我有以下域映射:

@Entity
@Table(name = "terminal_admin_role")
public class AdminRole {

    @Id
    @Column(name = "role_id", nullable = false, unique = true)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id")
    @SequenceGenerator(name = "user_id", sequenceName = "user_id")
    private Long adminId;

    @Column(name = "role")
    private String role;

    public AdminRole(String role) {
        this.role = role;
    }

    public AdminRole() {
    }

    // get set

    @Override
    public String toString(){
        return role;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof AdminRole)) {
            return false;
        }

        AdminRole adminRole = (AdminRole) o;

        if (!role.equals(adminRole.role)) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        return role.hashCode();
    }
}

@Entity
@Table(name = "terminal_admin")
public class TerminalAdmin {
    @ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinTable(name = "admin_role", joinColumns = { 
        @JoinColumn(name = "admin_id", nullable = false) }, 
        inverseJoinColumns = { @JoinColumn(name = "role_id", 
                nullable = false) })
    private Set<AdminRole> adminRoles;      
    //...
}

并执行以下代码:
控制器:

@RequestMapping(value = "/admin/addNewAdmin")
public String adminUsers(@ModelAttribute @Valid TerminalAdmin terminalAdmin,
        BindingResult bindingResult, ModelMap model, Principal principal, HttpSession session) {
    ...
    terminalAdmin.setCreateDate(Calendar.getInstance());
    terminalAdminService.saveTerminalAdmin(terminalAdmin);
    ...
 }

服务:

@Override
@Transactional
public void saveTerminalAdmin(TerminalAdmin newAdmin) {
    String rawPassword = newAdmin.getPassword();
    newAdmin.setPassword(passwordEncoder.encode(newAdmin.getPassword()));
    terminalAdminDao.save(newAdmin);
    emailService.sendAdminCreatedEmail(rawPassword, newAdmin.getEmail(), newAdmin.getAdminRoles());
    emailService.sendAdminRegisteredForAdminEmail(newAdmin);
}

道:

@Override
@Transactional
public void save(TerminalAdmin terminalAdmin) {
    sessionFactory.getCurrentSession().save(terminalAdmin);
}

之后,我看到管理员角色已绑定到数据库中AdminRole表中重复的用户。

我有什么错 我写了equals方法。

聚苯乙烯

在保存调试之前,我看到以下值:

在此处输入图片说明

因为在新的TerminalAdmin ,它引用的AdminRole不包含ID。 ID是实体的标识。 它不使用equals()来标识身份。 没有ID,Hibernate只是将其视为要AdminRole到数据库的新AdminRole (因为您已在TerminalAdmin设置了相应的层叠选项)

您可能会有一些选择

  1. 将您的AdminRole的ID更改为role String,或者/和
  2. 通过role字符串查找正确的AdminRole ,并将其设置在新的TerminalAdmin实体中,或/和
  3. 在传入的请求中包含AdminRole ID,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM