3

对于希望直接返回实体类的 Web 服务开发人员来说,这是一个常见问题。即使加载了我需要的所有数据,仍然有许多我不需要的未初始化代理和集合。我希望他们只返回 null 而不会抛出延迟加载异常。基本上我只想要 POJO 合同,但是必须清除代理和休眠集合才能获得它(除非休眠中有一些我不知道的新方法)。我可以使用 MapStruct 来执行此操作吗?

如果需要,有关此的更多详细信息:

http://www.mojavelinux.com/blog/archives/2006/06/hibernate_get_out_of_my_pojo/

http://www.gwtproject.org/articles/using_gwt_with_hibernate.html

吉利德是我发现的唯一一个对此有效的东西,但它已不再存在。

4

1 回答 1

3

是的,您可以使用 MapStruct 做到这一点。但是,只能通过明确标记要映射的内容和要忽略的内容。

假设您有以下课程:

public class Car {

    private String name;
    private int year;
    //This is lazy loaded
    private List<Wheel> wheels;
    //getters and setters omitted for simplicity
}

public class Wheel {
    private boolean front;
    private boolean right;
    //getters and setters omitted for simplicity
}

您将需要一个如下所示的映射器:

@Mapper
public interface CarMapper {

    @Mapping(target="wheels", ignore=true)
    Car mapWithoutWheels(Car car);

    Car mapWithWheels(Car car);

    List<Wheel> map(List<Wheel> wheels);

    Wheel map(Wheel wheel);
}

如果要强制 MapStruct 创建新对象而不进行直接映射List<Wheel>,则需要 和的显式映射。Wheel目前,如果 MapStruct 发现源类型和目标类型相同,它会直接分配(对于列表,它将创建一个新列表,但不会在列表元素中调用 getter)。

如果Wheel有一些延迟加载的元素,那么您可以有 2 种映射方法Wheel,您将不得不使用基于限定符的选择

于 2017-01-26T20:24:13.173 回答