如何在JPA中建立同一个表的关系?

时间:2017-01-08 19:06:49

标签: jpa tree

需要在同一个表之间建立关系。示例:对象“类别”具有子类别,子类别具有其他子类别。

在MySQL中创建一个列并指向同一个表的主键,但是,如何在JPA中创建?

我的代码是:

@Entity
@Table(name = "objects")
public class JObject {

    private long id;
    private String name;
    private JObject parentJObject;
    private Set<JObject> jObjects;

    public JObject(){
    }

    public JObject(long id){
        this.id = id;
    }

    public JObject(String name){
        this.name = name;
    }

    public JObject(String name, JObject parentJObject){
        this.name = name;
        this.parentJObject = parentJObject;
    }

    @Null
    @JoinColumn(name="parent_object_id", referencedColumnName="id")
    @ManyToOne(cascade=CascadeType.ALL)
    public JObject getParentJObject() {
        return parentJObject;
    }

    public void setParentJObject(JObject parentJObject) {
        this.parentJObject = parentJObject;
    }

    @Null
    @OneToMany(mappedBy = "parentJObject", cascade = CascadeType.ALL)
    public Set<JObject> getJObjects() {
        return jObjects;
    }

    public void setJObjects(Set<JObject> jObjects) {
        this.jObjects = jObjects;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @NotNull
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }     
}

制作对象:

JObject jObjectcategories = new JObject("Demo 1");
Set categoriesJObjects = new HashSet<JObject>(){{
    add(new JObject("Demo 1.1", jObjectcategories));
}};
jObjectcategories.setJObjects(categoriesJObjects);

jObjectDao.save(new HashSet<JObject>() {{
    add(jObjectcategories);
}});

但不起作用。日志说:

  

约束违规列表:[ConstraintViolationImpl {interpolatedMessage ='它必须为null',propertyPath = JObjects,rootBeanClass = class abcmodels.JObject,messageTemplate ='{javax.validation.constraints.Null.message}'}]

1 个答案:

答案 0 :(得分:0)

您需要在放置JPA注释的位置保持一致:要么全部在字段上,要么全部在getter上。但不要像你一样混合。

根据您的描述,OneToOne应该是ManyToOne,因为几个对象共享同一个父对象。

级联ALL没有意义:删除子项时不想删除父级。