1

I have tried a lot of ways. but it always errors! I have two entity classes: Role.java and RolePrivilege, this is Role.java:

package com.taxsys.nsfw.role.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="role")
public class Role implements Serializable{

    @Id
    @GenericGenerator(name="pk_uuid", strategy="uuid")
    @GeneratedValue(generator="pk_uuid")
    @Column(name="role_id")
    private String roleId;

    @Column(name="role_name",length=32, nullable=false)
    private String name;

    @Column(name="state", length=1)
    private String state;

    @OneToMany(targetEntity=RolePrivilege.class, 
    mappedBy="role", cascade=CascadeType.ALL,
    fetch=FetchType.EAGER)
    private Set<RolePrivilege> rolePrivileges = new HashSet<>();


    public static String ROLE_STATE_VALID = "1";
    public static String ROLE_STATE_INVALID = "0";


    public Set<RolePrivilege> getRolePrivileges() {
        return rolePrivileges;
    }
    public void setRolePrivileges(Set<RolePrivilege> rolePrivilege) {
        this.rolePrivileges = rolePrivilege;
    }
    public String getRoleId() {
        return roleId;
    }
    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public Role() {
    }
    public Role(String roleId, String roleName, String state, Set<RolePrivilege> rolePrivilege) {
        super();
        this.roleId = roleId;
        this.name = roleName;
        this.state = state;
        this.rolePrivileges = rolePrivilege;
    }
    public Role(String roleId) {
        this.roleId = roleId;
    }
}

this is RolePrivilege.java:

package com.taxsys.nsfw.role.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;


@Entity
@Table(name="role_privilege")
public class RolePrivilege implements Serializable{

    @Column(name="role_privilege_id", length=32)
    @GenericGenerator(name="pk_uuid", strategy="uuid")
    @GeneratedValue(generator="pk_uuid")
    @Id
    private String id;


    @ManyToOne(targetEntity=Role.class, fetch=FetchType.EAGER)
    @JoinColumn(name="role_id", referencedColumnName="role_id")
    private Role role;

    private String code;

    public RolePrivilege(Role role, String code) {
        super();
        this.role = role;
        this.code = code;
    }

    public RolePrivilege() {
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((code == null) ? 0 : code.hashCode());
        result = prime * result + ((role == null) ? 0 : role.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        RolePrivilege other = (RolePrivilege) obj;
        if (code == null) {
            if (other.code != null)
                return false;
        } else if (!code.equals(other.code))
            return false;
        if (role == null) {
            if (other.role != null)
                return false;
        } else if (!role.equals(other.role))
            return false;
        return true;
    }

}

Look my Role.java. the property 'cascade=CascadeType.ALL' is specified. Role represents Primary table in my program.But when I try to delete the data from role.it's error!

15:14:29,905 ERROR [http-bio-8425-exec-4] JDBCExceptionReporter:234 - Cannot delete or update a parent row: a foreign key constraint fails (`itcasttax`.`role_privilege`, CONSTRAINT `FK45FBD62836249906` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`))

but in Role.java, I have specified cascade! I really don't understand why i still can't delete primary table.

朱可凡
  • 99
  • 2
  • 13
  • Possible duplicate of http://stackoverflow.com/questions/18345598/hibernate-manytoone-only-works-with-cascadetype-all/18345715#18345715 , http://stackoverflow.com/questions/18358407/org-hibernate-objectdeletedexception-deleted-object-would-be-re-saved-by-cascad/18358631#18358631 – Luca Basso Ricci Mar 23 '17 at 07:48

1 Answers1

0

use below code .

@OneToMany(fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "role")
@Cascade(value = { CascadeType.SAVE_UPDATE, CascadeType.DELETE })
@Fetch(FetchMode.SELECT)
private Set<RolePrivilege> rolePrivileges
santosh gore
  • 319
  • 2
  • 21