【问题标题】:How to Load Collection in hibernate which fetch type is Lazy?如何在休眠中加载集合,哪个获取类型是惰性的?
【发布时间】:2014-05-29 17:34:37
【问题描述】:

我在我的项目中使用 Hibernate、Spring 和 Dozer。

我的问题是我无法加载延迟获取集合(列表)。 我正在使用 Dozer 将实体类转换为(Dto)类。 我认为推土机用户知道这些事情。

当我调试时,我从实体类中的 DB 获取所有数据,但是当我通过 Dozer 转换为 Dto 时,我在 Collection 中得到 null,这是 Lazy Fetched。

请帮帮我。提前致谢!

当我将实体转换为 Dto 时,我无法获取开发者列表。我有确切的 Dto 类名称 DeveloperFounder 并将它们映射到字符串配置文件中。我尝试了@Select 在连接表上,然后它加载并工作正常,但我不希望那样。如果我必须在我的 servicemanager 类中添加额外的功能,请帮助我。

@Entity
@Table(name = "table")
public class Founder {

    @Id
    @Column(name = "foun_id")
    @GeneratedValue(generator = "uuid")
    private String id;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name = "reg_address_id")
    private Address registeredAddress;


    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "jointable", joinColumns = { @JoinColumn(name = "foun_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dev_id", nullable = true) })
    private List<Developer> developer;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Address getRegisteredAddress() {
        return registeredAddress;
    }

    public void setRegisteredAddress(Address registeredAddress) {
        this.registeredAddress = registeredAddress;
    }

    public List<Developer> getDeveloper() {

        return developer;
    }

    public void setDeveloper(List<Developer> developer) {
        this.developer = developer;
    }

}

@Entity
@Table(name = "tbl")
public class Developer {

    @Id
    @Column(name = "dev_id")
    @GeneratedValue(generator = "uuid")
    private String id;

    @Column(name = "file_number")
    private String fileNumber;

    @Column(name = "flat_info")
    private String flatInfo;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name = "address_id")
    private Address address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFileNumber() {
        return fileNumber;
    }

    public void setFileNumber(String fileNumber) {
        this.fileNumber = fileNumber;
    }

    public String getFlatInfo() {
        return flatInfo;
    }

    public void setFlatInfo(String flatInfo) {
        this.flatInfo = flatInfo;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

【问题讨论】:

  • 你能显示实体类和ORM映射吗?我怀疑映射的是字段,而不是 getter,这就是为什么不调用休眠生成的代理 getXXX 方法的原因。
  • 我检查了我的整个代码,没有任何遗漏,也没有语法错误。

标签: java hibernate lazy-loading dozer lazy-initialization


【解决方案1】:

正如我在评论中所写,Dozer 很可能直接访问 FounderDeveloper 字段并忽略 getter。当 Hibernate 为延迟加载创建代理时,这最终会在转换后得到空集合。考虑更改您的类以将映射信息添加到 getter 而不是字段。

这个问题可能对你有用 - Is it possible to configure Dozer such that by default fields are rather accessed directly that through setter-/getter method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多