Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中是否仍然可以检索子项的直接父项?_Java_Spring_Jpa - Fatal编程技术网

Java 在JPA中是否仍然可以检索子项的直接父项?

Java 在JPA中是否仍然可以检索子项的直接父项?,java,spring,jpa,Java,Spring,Jpa,我正在使用Spring框架创建一个简单的REST服务器。 其中一个类需要具有自联接一对多关系,才能检索有关其父对象的数据。这个班看起来像这样 @Entity @Table(name = "item", schema = "tmp", uniqueConstraints = { @UniqueConstraint(columnNames = "item_id"), @UniqueConstraint(columnNames = "item_name")}) public class Ite

我正在使用Spring框架创建一个简单的REST服务器。 其中一个类需要具有自联接一对多关系,才能检索有关其父对象的数据。这个班看起来像这样

@Entity
@Table(name = "item", schema = "tmp", uniqueConstraints = {
    @UniqueConstraint(columnNames = "item_id"), @UniqueConstraint(columnNames = "item_name")})
public class Item implements Serializable {

  private static final long serialVersionUID = 1L;

  private Integer itemId;
  private String itemName;
  private String itemDescription;
  private Item itemParent;
  private boolean isEndItem;
  private List<Item> childrenItems;


  public Item() {}

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "item_id", unique = true, nullable = false)
  public Integer getItemId() {
    return itemId;
  }

  public void setItemId(final Integer itemId) {
    this.itemId = itemId;
  }

  @Column(name = "item_name", unique = true, nullable = false)
  public String getItemName() {
    return itemName;
  }

  public void setItemName(final String itemName) {
    this.itemName = itemName;
  }

  @Column(name = "item_description", unique = false, nullable = false)
  public String getItemDescription() {
    return itemDescription;
  }

  public void setItemDescription(final String itemDescription) {
    this.itemDescription = itemDescription;
  }

  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JsonManagedReference(value = "item-item")
  @JoinColumn(name="item_parentid")
  public Item getParentItem() {
    return this.itemParent;
  }

  public void setParentItem(final Item itemParent){
    this.itemParent = itemParent;
  }

  @OneToMany(mappedBy="childrenItems", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JsonBackReference(value = "item-item")
  public List<Item> getChildrenItems(){
    return this.childrenItems;
  }

  public void setChildrenItems(final List<Item> childrenItems){
    this.childrenItems = childrenItems;
  }

  @Column(name = "item_isendproduct", unique = false, nullable = false)
  public boolean isEndItem() {
    return isEndItem;
  }

  public void setEndItem(final boolean isEndItem) {
    this.isEndItem = isEndItem;
  }
}
但我不想知道有关父对象的父对象的信息。 有什么注释可以用来实现这一点吗


提前感谢

您应该添加
parentItemId
,而不是整个父对象。因此,每个项都有一个通过id引用其父项的错误,“@OneToOne或com.tmp.model.item.parentItemId上的@ManyToOne引用了一个未知的实体:java.lang.Integer”@Yogesh的建议对JPA来说是一个错误的建议,关键是要管理它。通常,您会希望将JSON表示与实际存储的格式分离——不过,作为一种快速攻击,您可以在关系字段上使用类似于
@JsonIdentityInfo
的内容。@chrylis是否有任何示例我可以看一下?您的映射是错误的。如果您有一个1-N并指定一个mappedBy,那么它应该是元素类中指向该类的字段。对于1-N,mappedBy在另一侧指定N-1字段。你的不是
[  
   {  
      "itemId":1,
      "itemName":"Entry",
      "itemDescription":"Entry Menu",
      "endItem":false,
      "parentItem":null
   },
   {  
      "itemId":2,
      "itemName":"Salad",
      "itemDescription":"Salad Menu",
      "endItem":false,
      "parentItem":{  
         "itemId":1,
         "itemName":"Entry",
         "itemDescription":"Entry Menu",
         "endItem":false,
         "parentItem":null
      }
   },
   {  
      "itemId":3,
      "itemName":"House Salad",
      "itemDescription":"House Salad",
      "endItem":true,
      "parentItem":{  
         "itemId":2,
         "itemName":"Salad",
         "itemDescription":"Salad Menu",
         "endItem":false,
         "parentItem":{  
            "itemId":1,
            "itemName":"Entry",
            "itemDescription":"Entry Menu",
            "endItem":false,
            "parentItem":null
         }
      }
   }
]