spring - 使用现有关系创建新模型
问题描述
所以我有一个模型叫做Issue
,这个模型有一个关系叫做IssueType
。
AIssue
有一个type_id
,它将它们链接在一起。
AIssueType
有 aid
和 aname
是唯一的。
问题是当我想创建一个问题时,我想发送这样的请求
POST https://server/issues
Content-Type: application/json
{
"description": "just some random description",
"type": "Generic"
}
所以这里type
是 的name
,IssueType
创建它时。
我该怎么做呢?
@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 Data Rest 所指的定义查找类型:
很多时候,域模型包含的类型是值对象,但实际上代表了一组专用的可能值中的特定值。上面示例的 Country 类实际上属于该类别。因为我们需要管理超级值集,所以有一个存储库。如果还应允许它通过 REST 管理集合,则也需要导出存储库。由于存储库通常指示正在管理的聚合,因此 Spring Data REST 处理该场景的默认方式是在遇到 Country 实例的任何地方呈现到关联资源的链接。 Hopper 发布系列增加了声明所谓的查找类型的方法,然后 Spring Data REST 会为此呈现一个内联在表示中的单个属性,并注册相应的 Jackson Deserializer 以确保该属性值被转换回该值的实例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);
}
}
推荐阅读
- javascript - 如何利用有区别的联合来推断函数的返回类型
- qt - windeployqt 不适用于使用 qmldir 模块的项目
- java - 在 Spring Security 中仅禁用少数路径的过滤器
- php - 使用 PHP、Ajax 和 Laravel 8 中的干预将图像文件上传到数据库
- excel - 将文本从 PowerPoint 文本框导出到 Excel 单元格 (VBA)
- azure-webjobs - 使用 AzureWebJobsStorage for Web Job Timer Triggers 时如何配置存储帐户的自动故障转移
- swift - 菜单未更新(SwiftUI 错误?)
- r - 总是选择向量的中间元素
- no-framework - 如何在 vanillaJS 项目中使用 MongoDB
- sql - 雪花中有融化命令吗?