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

如何防止模型映射器在springdatajpa中不映射延迟加载的集合?

米树
2023-03-14

我正在使用Spring BootSpring Data JPA和mysql制作一个Restapi。我有用户和角色实体。用户可以有很多角色,角色可以有很多用户。我是ModelMapper依赖项,用于将实体转换为DTO。

我已将角色集合获取类型设置为惰性。但是ModelMapper正在用户实体上调用getRoles()方法。如何停止它。

注意:用户和用户数据有相同的字段。

用户类别:

@Entity
@Table(name = "users")
public class User  {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
        name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id",referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "id")
)
private Set<Role> roles;
}

角色类别:

@Entity
@Table(name = "roles")
public class Role  {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String roleName;
}

用户服务类:

@Service
@Transactional
public class UserService {

@Autowired
private ModelMapper mapper; 
@Autowired
private UserRepository userRepository;

public UserDTO find(Integer id){
   User user = userRepository.findById(id).get();
   return mapper.map(user,UserDTO.class);
}
}

共有2个答案

咸育
2023-03-14

您可以应用条件跳过操作。https://stackoverflow.com/a/38729404/2039546

ModelMapper modelMapper = new ModelMapper();
TypeMap<User, UserDTO> typeMap = modelMapper
        .createTypeMap(User.class, UserDTO.class);
// Create empty list condition for JPA.
Condition<Object, Object> emptyListCondition = mc ->
        (!(mc.getSource() instanceof PersistentCollection) 
                || ((PersistentCollection) mc.getSource())
                .wasInitialized());
// Add mappings.
typeMap.addMappings(mapper -> mapper
        .when(emptyListCondition)
        .map(User::getRoles, UserDTO::setRoles));

// Test.
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
皇甫乐
2023-03-14

你必须声明一个跳过属性。

例:

TypeMap<Game, GameDTO> propertyMapper = this.mapper.createTypeMap(Game.class, GameDTO.class);
propertyMapper.addMappings(mapper -> mapper.skip(GameDTO::setId));

参考: https://www.baeldung.com/java-modelmapper

 类似资料:
  • 我正在使用模型映射器(http://modelmapper.org/)将具有延迟加载对象列表(通过Hibernate)的实体映射到具有modelmapper.map()的DTO。 输出dto的列表为空值,但实体的列表已填充。当我改为“急切加载”时,一切正常,但我的查询太大,所以这不是一个选项。 有人知道模型映射器如何映射代理的Hibernate实体类吗? 这是我的父实体: 运输署署长: 这是我如何

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 我使用JPA2.1和Hibernate来实现。 举个示例: 我有一个父实体(称为父实体)和一个子实体(称为子实体)。 可嵌入唯一密钥: 父实体: 子实体: 对于一些关于Parent查询,我需要child,而对于某些情况,我不需要。 我试图通过uniqueKey获取数据,但没有调用getChild(),但它仍然在获取父级数据的同时获取子级数据。 在参考了这个答案之后。它说在@OneToOne的情况下

  • 我正在开发和spring应用程序,对于对象映射,我使用ModelMapper库。 我能够映射基本类映射,但当我尝试映射2个集合元素时,源是一组枚举,具有其他属性,如名称和描述,目标是具有id、名称和描述的pojo。 我已经尝试了类型地图和转换器在映射配置文件,但我得到例外的映射器。 源类来自其他应用程序(其依赖项已在pom.xml中添加)。我也不希望源类型作为目标setter中的参数。 前。 资料

  • 在对这个话题进行了大量的测试和研究之后,我无法完全解决我的问题。我正在springboot应用程序中使用modelmapper进行实体/DTO映射。我正在尝试配置modelmapper,将一个集合映射到一个简单的DTO对象。我已经创建了一个自定义转换器,它正在按预期工作: 我现在的问题是将此转换器应用于所有“集合”= 如果我直接在模型映射器中添加转换器,它就是不工作。 你对此有什么提示或解决办法吗

  • 我试图使用http://modelmapper.org/表示DAO和模型类的库- 模型类- 道类- 公共类主题{私有字符串名称; 映射逻辑 ModelMapper似乎不起作用,它给我提供了主题类项目,而不是主题模型类项目

  • 问题内容: 我的多对一映射存在性能问题。当我在日志文件中调试SQL查询时,可以进行主体查询,但是在我有其他表示多对一对象映射的查询之后。 Entity.hbm.xml: Object1.hbm.xml: Object2.hbm.xml: 查询HBM: 在pom.xml中 问题答案: 您是否尝试过像这样的FetchMode.SELECT?

  • 我有一个用户的Entity-DTO转换器,如下所示: 我有很多Entity-DTO要管理,所以我想像这样抽象转换器 我的问题是:我必须放置什么而不是???