0

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.

Community
  • 1
  • 1
denisazzurro
  • 1
  • 1
  • 2
  • 1
    Show us your code (the code which creates and adds package templates), and fix your mapping. `mappedBy` means: The mapping of this association is on the other side of the association. So you shouldn't have a JoinTable annotation on packageTemplateList. See http://stackoverflow.com/questions/19896025/understanding-annotations-and-jpahibernate/19896470#19896470 – JB Nizet Nov 11 '13 at 10:10

1 Answers1

0

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;
}
JamesB
  • 7,774
  • 2
  • 22
  • 21