好的,我有3个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。
class Topic {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@Column(nullable = false)
String header;
@Column(nullable = false)
String description;
@Column(name = "is_anonymous", nullable = false)
boolean isAnonymous;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@Column(name = "creation_date", nullable = false)
LocalDateTime creationDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_id", nullable = false)
User author;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id", nullable = false)
Category category;
}
我还有一个主题DTO
class TopicDTO {
String header;
String description;
boolean isAnonymous;
LocalDateTime creationDate;
UserDTO userDTO;
CategoryDTO categoryDTO;
}
我可以将ModelMapper注入到TopicService中,并用它来转换,但是它并不能像我需要的那样工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryDTO将为null,但是在调试中,在转换之前,在Topic对象- Category对象和User对象都不为null时,它们被初始化了。
我尝试为每个实体编写一个CRUD服务,在其中注入扩展CrudRepository的存储库。当我从控制器TopicDTO获取时,我调用topicService.save(topicDTO),但在主题服务中,方法保存,我不想级联save user,我不想级联save categories,我想用现有的samples category和user保存主题,我怎么能做到呢?对不起我糟糕的英语
3条答案
按热度按时间atmip9wb1#
您可以使用MapStruct之类的代码生成器,我真的不太熟悉它,因为您必须学习如何注解您的DTO以便Map它们,而且它已经被弃用了。(例如,它只能用junit4测试)。
你应该使用Lombok构建器从你的实体示例化DTO。此外,你可以在TDD中使用junit5轻松地测试它,如下所示:
您的Map器应该如下所示(我让您完成它以使您的测试通过):
9q78igpj2#
您可以在
TopicDTO
类中创建一个of
方法来构造对象。提供userDTO和categoryDTO作为参数将允许将它们设置为null或它们各自的对象(如果存在)。ne5o7dgx3#
你应该只使用构造函数来创建对象!在示例化对象时不要使用getter/setter,因为这是一个反模式。很难维护你已经使用过的setter和没有使用的setter。对象应该通过构造函数和关键字“new”完全创建,它将立即有一个状态。
要将EntityMap到dto,我建议创建一个简单的Mapper类,它在构造函数中接受Entity并返回新的dto对象,就这样。