【问题标题】:Create a new model with a existing relationship使用现有关系创建新模型
【发布时间】:2020-01-27 11:30:44
【问题描述】:

所以我有一个名为Issue 的模型,这个模型有一个名为IssueType 的关系。
一个Issue 有一个type_id,它将它们链接在一起。
IssueType 有一个 id 和一个 name,这是唯一的。

问题是当我想创建一个问题时,我想发送这样的请求

POST https://server/issues
Content-Type: application/json

{
  "description": "just some random description",
  "type": "Generic"
}

所以这里typeIssueTypename,在创建它时。

我该怎么做?

@Table(name = "issues")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Issue {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "description")
    private String description;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "type_id", referencedColumnName = "id")
    private IssueType type;
}
@Table(name = "issue_types")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class IssueType {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column()
    private String name;
}
@RepositoryRestResource(
    collectionResourceRel = "issues",
    path = "issues",
    excerptProjection = IssueProjection.class
)
public interface IssueRepository extends JpaRepository<Issue, Long> {
}
@Projection( types = Issue.class)
public interface IssueProjection {
    Long getId();

    Double getLongitude();

    Double getLatitude();

    Integer getFloor();

    String getDescription();

    @Value("#{target.type.name}")
    String getType();
}

【问题讨论】:

    标签: spring hibernate spring-data-jpa spring-data-rest


    【解决方案1】:

    我相信您在这里想要的是 Spring Data Rest 所指的定义查找类型:

    通常,域模型包含的类型是值对象,但 实际上代表一组专用的特定值 可能的值。上面示例的 Country 类实际上属于 属于那个类别。因为我们需要管理超值集, 有一个存储库。如果应该允许管理 同样通过 REST 设置,存储库也需要导出。作为 存储库通常表示正在管理的聚合,Spring Data REST 处理该场景的默认方式是呈现链接 到遇到 Country 实例的关联资源。 Hopper 发布序列增加了声明所谓的查找类型的方法, 然后 Spring Data REST 为其呈现一个内联的单个属性 在表示中,还注册了相应的杰克逊 反序列化器以确保该属性值被翻译 回到 PUT 和 POST 请求的该值类型的实例。

    https://spring.io/blog/2016/05/03/what-s-new-in-spring-data-hopper#lookup-types

    https://docs.spring.io/spring-data/rest/docs/current/reference/html/#_customizing_item_resource_uris

    比如:

      @Override
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.withEntityLookup()
          .forRepository(IssueType.class)
          .withIdMapping(IssueType::name)
          .withLookup(IssueTypeRepository::findByName); 
      }
    }
    

    【讨论】:

    • 哦,这真的很酷,这正是我想要的,谢谢! :) 但是该死的幕后发生了很多魔术
    • 嗨艾伦,感谢您的回答。我遇到了一个问题,在 IssueType 中添加时它不使用验证,我怎样才能让它这样做或对该字段使用任何验证?
    • 啊,我的错...我很愚蠢。必须在问题上的关系上指定它
    【解决方案2】:

    您可以创建一个单独的对象,例如 IssueDto,它将代表您的 JSON 请求,如下所示:

    @Data
    public class IssueDto {
       private String type;
       private String description;
    }
    

    然后将此对象转换为您的IssueIssueType 对象。

    【讨论】:

    • 我如何注册这是存储库中的输入对象,然后我可以在哪里转换它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2017-07-30
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多