如何在JPA中建立同一个表的关系?
需要在同一个表之间建立关系。示例:对象“类别”具有子类别,子类别具有其他子类别 在MySQL中创建一列并指向同一表的主键,但是,如何在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>
@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尝试将这些函数迁移到一个对象,但不起作用。更新了主要帖子。