如何通过反射获取懒惰休眠字段的值

时间:2019-03-05 19:09:59

标签: java hibernate reflection

我发现了类似的问题,但他们没有回答我的问题。

我有两个具有多对一关系的实体-单向的。 但最重要的是,这种关系是懒惰的。因为使用惰性连接是正确的,所以每个人都知道。

代码:

@Entity
public class User implements BaseEntity {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    private City city;

}

@Entity
public class City implements BaseEntity {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;
}

interface BaseEntity {
    void setId(Long id);
    Long getId();
}

我编写了一种方法,该方法使您可以按实体的已传输字段进行搜索。 一个如何工作的示例:

public class Search<T extends BaseEntity> {

    public List<T> getByFields(T entity, List<FieldHolder> data) {
        // create criteria with passed field name and value by reflection
    } 
}

class FieldHolder {
    private String fieldName;
    private Object value;
    /**
     * "true" - means that the field "value" contains id related object
     * "false" - elementary type like: String, Wrapper, Primitive
     */
    private boolean isRelationId;
}

问题是当您需要搜索和相关对象时(通过创建相关查询),问题就开始了。

以下条目用于发送关联的字段:“ city.id”,问题是当我转移相关对象(城市)的本质时,它在代理中,无法通过城市反射获得ID

如果您指定以下内容,我的功能将完美运行

@ManyToOne(fetch = FetchType.EAGER)
private City city;

但是由于我有很多相关的对象,所以它将极大地影响性能。因此,我想解决这个问题以免延迟加载。

我知道这不是一件容易的事。但是也许有一些机会可以解决这个问题。

0 个答案:

没有答案