当前位置: 首页 > 知识库问答 >
问题:

Spring data rest和jpa@OneTomany重复“_links”

从建明
2023-03-14

下面是我的spring-data-rest存储库:

public interface ProfileJpaRepository extends JpaRepository<Profile, Long> {
}

下面是我的实体(为简洁起见,没有显示getter和setter)。

profile.java:

@Entity
@Table(name = "PROFILE")
public class Profile {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String description;

    // Don't use mappedBy="profile" because attributes are not persisted properly
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "PROFILE_ID")
    private Set<Attribute> attributes;

    ...
}
@Entity
@Table(name = "ATTRIBUTE")
public class Attribute {

     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     @Column(name = "ID")
     private Long id;

     private String uri;

     @ManyToOne(fetch = FetchType.EAGER)
     private Profile profile;

     @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name="ATTRIBUTE_DATAS")
     private List<String> datas = new ArrayList<>();

     public Attribute() {}

     public Attribute(String uri, List<String> datas) {
        this.uri = uri;
        this.datas = datas;
    }

    ...
}
{
    "description" : "description-value",
    "attributes" : [
        {
            "uri" : "uri-a",
            "datas" : ["uri-a-value"]
        },
        {
            "uri" : "uri-b",
            "datas" : ["uri-b-value"]
        }
    ]
}
{
  "_embedded" : {
    "profiles" : [ {
      "description" : "description-value",
      "attributes" : [ {
        "uri" : "uri-a",
        "datas" : [ "uri-a-value" ],
        "_links" : {
          "profile" : {
            "href" : "http://localhost:8880/profiles/1"
          }
        }
      }, {
        "uri" : "uri-b",
        "datas" : [ "uri-b-value" ],
        "_links" : {
          "profile" : {
            "href" : "http://localhost:8880/profiles/1"
          }
        }
      } ],
      "_links" : {
        "self" : {
          "href" : "http://localhost:8880/profiles/1"
        },
        "profile" : {
          "href" : "http://localhost:8880/profiles/1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8880/profiles"
    },
    "profile" : {
      "href" : "http://localhost:8880/profile/profiles"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}
{
  "_embedded" : {
    "profiles" : [ {
      "description" : "description-value",
      "attributes" : [ {
        "uri" : "uri-a",
        "datas" : [ "uri-a-value" ]
      }, {
        "uri" : "uri-b",
        "datas" : [ "uri-b-value" ]
      } ],
      "_links" : {
        "self" : {
          "href" : "http://localhost:8880/profiles/1"
        },
        "profile" : {
          "href" : "http://localhost:8880/profiles/1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8880/profiles"
    },
    "profile" : {
      "href" : "http://localhost:8880/profile/profiles"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 0
  }
}

有关依赖关系版本的更多信息可以在这里找到。如果需要,我没有重写这些(http://docs.spring.io/spring-boot/docs/1.4.4.release/reference/html/appendience-dependency-versions.html)

多谢了。

共有1个答案

姜鸿畴
2023-03-14

为了解决这个问题,我一直在使用投影(更多信息见http://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts)。我在发帖的时候并没有意识到这个特点。

我必须注释我的存储库并告诉它使用我的InlineAttributes投影:

import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(excerptProjection = InlineAttributes.class)
public interface ProfileJpaRepository extends JpaRepository<Profile, Long> {
}

在Attribute类上,我必须添加@jsonIgnore注释:

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = "ATTRIBUTE")
public class Attribute {
     ...

     @ManyToOne(fetch = FetchType.EAGER)
     @JsonIgnore
     private Profile profile;

     ...
}
import org.springframework.data.rest.core.config.Projection;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;    

@Projection(name = "inlineAttributes", types = { Profile.class })
@JsonPropertyOrder({ "description", "attributes" })
public interface InlineAttributes {

    public String getDescription();
    public Set<Attribute> getAttributes();
}
http://localhost:8880/profiles?projection=inlineAttributes
 类似资料:
  • 我有两个实体的订单和项目。在Order entity中,id是OrderId、UserId的复合主键,但在Items中,外键仅为Order id。 如何使用订单Id获取项目列表 我尝试使用mappedBy,如上所述,无论在哪种情况下,我都得到了错误。 任何帮助都是非常感谢的。

  • 问题内容: 我正在使用带有注释的Hibernate(在spring),并且我有一个对象,该对象具有有序的多对一关系,该对象的子对象具有复合主键,该子对象的一个​​组成部分是返回到该对象的外键。父对象的ID。 结构看起来像这样: 我尝试了各种注释的组合,但似乎都不起作用。这是我能想到的最接近的: 经过长时间的实验后,我得出了这一结论,在该尝试中,我进行的其他大多数尝试都产生了由于各种原因甚至无法加载

  • 问题内容: 我目前正在阅读有关实体关联的Hibernate文档,但遇到一些困难却难以理解。它在本质上做的区别和联系。尽管我在实际项目中使用了它们,但是我无法完全理解它们之间的差异。据我了解,如果一个表/一个实体与另一个实体有关联,则该关联应来自另一侧。那么,我们应该如何根据具体情况决定选择哪个呢?它又如何影响数据库/查询/结果?到处都有很好的例子吗? PS:我认为这与问题相关,如果有人可以解释关联

  • 我有三个班,站点,GoupIP和IP 一个站点有一个或多个抱怨。GroupIP有一个或多个IP。 代码如下: 地点 群居 IP 在GroupIp课堂上,我得到: 在属性“ips”中,“映射者”值“groupip”无法解析为目标实体上的属性。 我的代码出了什么问题??

  • 我试图定义两个类之间的双向关系。拥有方是类测验,相反方是用户。一个用户可以创建许多测验,而一个测验只能有一个创建它的用户。我在网上找到的每一个教程都指出,在owning方面,您指定了ManyToOne注释和JoinColumn,在相反的方面,您使用owners字段的名称指定了OneToMany和mappedBy。然而,当我这样做时,IDE给了我一个错误“找不到逆关系”。我在这个概念上哪里出错了?如

  • 问题内容: 我有一个由以下映射的关联: 我想使用Criteria API返回所有包含一个或多个带有attribute实体的实体的列表。我不希望映射集合被查询过滤。 例如,给出以下内容: 该查询应返回以下内容: 到目前为止,我正在使用以下条件查询: 然而,它返回的等价于 即,它为每个子元素返回一个父记录(填充了子集合) 有谁知道在这种情况下如何仅返回唯一的父元素? 意见表示赞赏,p。 问题答案: 您