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

如何在JPA中建立同一个表的关系?,jpa,tree,Jpa,Tree,需要在同一个表之间建立关系。示例:对象“类别”具有子类别,子类别具有其他子类别 在MySQL中创建一列并指向同一表的主键,但是,如何在JPA中创建 我的代码是: @Entity @Table(name = "objects") public class JObject { private long id; private String name; private JObject parentJObject; private Set<JObject>

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

在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;
    }     
}
@实体
@表(name=“objects”)
公共类就业项目{
私人长id;
私有字符串名称;
私人JObject parentJObject;
私有集作业对象;
公共工程{
}
公共作业项目(长id){
this.id=id;
}
公共作业对象(字符串名称){
this.name=名称;
}
公共作业对象(字符串名称,作业对象父作业对象){
this.name=名称;
this.parentJObject=parentJObject;
}
@空的
@JoinColumn(name=“parent\u object\u id”,referencedColumnName=“id”)
@多通(级联=级联类型.ALL)
PublicJobject getParentJObject()的{
返回parentJObject;
}
public void setParentJObject(JObject parentJObject){
this.parentJObject=parentJObject;
}
@空的
@OneToMany(mappedBy=“parentJObject”,cascade=CascadeType.ALL)
公共集getJObjects(){
返回作业对象;
}
public void设置作业对象(设置作业对象){
this.jObjects=jObjects;
}
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@NotNull
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.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);
}});
JObject-jObjectcategories=新的JObject(“演示1”);
Set categoriesJObjects=new HashSet(){{
添加(新作业对象(“演示1.1”,作业对象类别));
}};
jObjectcategories.setJObjects(categoriesJObjects);
jObjectDao.save(新HashSet()){{
增加(工作类别);
}});
但这不起作用。日志上写着:

约束冲突列表:[ConstraintViolationImpl{interpolatedMessage='It必须为null',propertyPath=JObjects,rootBeanClass=class a.b.c.models.JObject,messageTemplate='{javax.validation.constraints.null.message}]


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

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


而且级联都没有意义:删除子对象时,您不希望删除父对象。

谢谢,我在变量中设置了anotation,而不是函数。工作正常。工作正常,但不能保存关系。我发现:y尝试将这些函数迁移到一个对象,但不起作用。更新了主要帖子。