需要在同一个表之间建立关系。示例:对象“类别”具有子类别,子类别具有其他子类别。
在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}'}]
答案 0 :(得分:0)
您需要在放置JPA注释的位置保持一致:要么全部在字段上,要么全部在getter上。但不要像你一样混合。
根据您的描述,OneToOne应该是ManyToOne,因为几个对象共享同一个父对象。
级联ALL没有意义:删除子项时不想删除父级。