JPA映射表无法删除

时间:2017-08-08 08:08:53

标签: java spring jpa spring-boot mariadb

我有实体帐户,角色,帐户角色。

@Entity
public class Account {
    @Id
    private String loingId;
    private String username;
    private String password;
    private String email;
    private boolean enable;

    @OneToMany(mappedBy = "account", orphanRemoval = true)
    private List<AccountRole> accountRoles = new ArrayList<>();

    public String getLoingId() {
        return loingId;
    }
    public void setLoingId(String loingId) {
        this.loingId = loingId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public boolean isEnable() {
        return enable;
    }
    public void setEnable(boolean enable) {
        this.enable = enable;
    }
    public List<AccountRole> getAccountRoles() {
        return accountRoles;
    }
    public void setAccountRoles(List<AccountRole> accountRoles) {
        this.accountRoles = accountRoles;
    }
    public void addAccountRoles(AccountRole accountRoles) {
        if (this.accountRoles == null){
            this.accountRoles = new ArrayList<>();
        }
        this.accountRoles.add(accountRoles);
        accountRoles.setAccount(this);
    }
    public void removeAccountRoles(){
        this.accountRoles = null;
    }
}

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String description;
    private boolean enable;

    @OneToMany(mappedBy = "role")
    private List<AccountRole> accountRoles = new ArrayList<>();

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public boolean isEnable() {
        return enable;
    }
    public void setEnable(boolean enable) {
        this.enable = enable;
    }
    public List<AccountRole> getAccountRoles() {
        return accountRoles;
    }
    public void setAccountRoles(List<AccountRole> accountRoles) {
        this.accountRoles = accountRoles;
    }
}


@Entity
public class AccountRole implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "account_id")
    private Account account;

    @ManyToOne
    @JoinColumn(name = "role_id")
    private Role role;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Account getAccount() {
        return account;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
}

使用角色创建帐户即可。 更新中存在问题。

我想删除现有角色,只在更改帐户角色时添加更改后的角色。但是,现有数据不会从AccoutRole表中删除。

我该如何解决这个问题?

springBootVersion =&#39; 1.5.3.RELEASE&#39;

java 1.8

gradle依赖

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')

    testCompile('org.springframework.boot:spring-boot-starter-test')

    runtime ('org.mariadb.jdbc:mariadb-java-client')
}

1 个答案:

答案 0 :(得分:0)

一些想法:

思想1:尝试使用级联

是的,JPA 2.0应该使用orphanRemoval = true处理此问题,但让我们看看它是否有效。我认为这不是因为你不是在这里创造一个孤儿。从关系角度来看,映射仍然是“有效的”。

@OneToMany(mappedBy = "account", cascade = CascadeType.ALL) // or CascadeType.REMOVE
private List<AccountRole> accountRoles = new ArrayList<>();

思考2:首先尝试将帐户角色设置为空的hashmap:

account.setAccountRoles(new HashMap<AccountRole>());
account.getAccountRoles().add(accountRole);;