简体   繁体   中英

Hibernate many-to-one self-join association cascade update doesn't work

I have this self-join entity:

@Entity
@Table(name = "PackageTemplate")
public class PackageTemplate implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(unique = true, nullable = false)
    private Long idPackageTemplate;

    private Byte status;

    // bi-directional many-to-one association to PackageTemplate
    @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
    @JoinColumn(name = "packageTemplate")
    private PackageTemplate packageTemplate;

    // bi-directional many-to-one association to PackageTemplate
    @OneToMany(mappedBy = "packageTemplate", cascade = { CascadeType.ALL })
    @JoinTable(name = "PackageTemplate", joinColumns = { @JoinColumn(name = "packageTemplate", nullable = true) }, inverseJoinColumns = { @JoinColumn(name = "idPackageTemplate", nullable = false) })
    private List<PackageTemplate> packageTemplateList;

     public PackageTemplate() {
    }

    public Long getIdPackageTemplate() {
        return this.idPackageTemplate;
    }

    public Byte getStatus() {
        return this.status;
    }

    public void setStatus(Byte status) {
        this.status = status;
    }

    public PackageTemplate getPackageTemplate() {
        return this.packageTemplate;
    }

    public void setPackageTemplate(PackageTemplate packageTemplate) {
        this.packageTemplate = packageTemplate;
    }

    public List<PackageTemplate> getPackageTemplateList() {
        return this.packageTemplateList;
    }

    public void setPackageTemplateList(List<PackageTemplate> packageTemplateList) {
        this.packageTemplateList = packageTemplateList;
    }
}

When I update a packageTemplate setting PackageTemplateList, it doesn´t work. The related items keep the relationship with father.

No errors showed, just seems that cascade does nothing.

Any idea?


Solved, JB Nizet was right. The problem was the "mappedBy in packageTemplateList".

The code should be something like this:

// bi-directional many-to-one association to PackageTemplate
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "packageTemplate")
private PackageTemplate packageTemplate;

// bi-directional many-to-one association to PackageTemplate
@OneToMany
@JoinColumn(name = "packageTemplate")
private List<PackageTemplate> packageTemplateList;

This code is working now.

I suspect you are missing setting a back reference on the children to their parent.

You can achieve this by the following code in the setPackageTemplateList method.

public void setPackageTemplateList(List<PackageTemplate> packageTemplateList) {

    for(PackageTemplate template : PackageTemplateList) {
        template.setPackageTemplate(this);
    }
    this.packageTemplateList = packageTemplateList;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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