2017-01-08 79 views
0

需要在同一张表之间建立关系。示例:对象“类别”具有子类别,子类别具有其他子类别。如何在JPA中创建同一个表的关系?

在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 '它必须是空',的PropertyPath = JObjects,rootBeanClass = A类abcmodels.JObject,messageTemplate ='{javax.validation.constraints。 }}

回答

0

您需要在放置JPA注释的位置保持一致:或者全部放在字段上,或者全部放在getter上。但不要混淆,因为你在做。

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

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

+0

谢谢,我设置了变量的注释,而不是函数。工作正常。 –

+0

工作正常,但不保存关系。我发现这个:https://hellokoding.com/jpa-one-to-many-relationship-mapping-example-with-spring-boot-maven-and-mysql/ y尝试将这些函数迁移到一个唯一的对象,但不作品。更新了主帖。 –

相关问题