【问题标题】:How to read the first level parent data using hibernate如何使用hibernate读取一级父数据
【发布时间】:2016-06-27 05:06:52
【问题描述】:

我有两个休眠注释类。我正在对 FirstTable 进行休眠查询。从列表中检索数据后,使用 GSON 将对象转换为 JSON 字符串。转换后的 JSON 字符串还将包含子表的数据。我的要求是读取一级数据。它不应该查询子表。

尝试的步骤

为了在获取对象后实现这一点,我已将对象与 entitymanager 分离(也尝试过 session.evict)。关闭休眠会话和实体管理器对象。试图将对象转换为 JSON。这样做时,我得到了 LazyInitializationException。是否有解决方法或有其他方法可以实现这一点。

@Entity(name = "FirstTable")
@Table(name = "FirstTable")
@AccessType("property")
public class FirstTable {
    private SecondTable _SecondTable;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "SecondTable_ID")
    public SecondTable getSecondTable() {
        return _SecondTable;
    }
    public FirstTable setSecondTable(SecondTable value) {
        this._SecondTable = value;
        return this;
    }
    private long id;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="Id")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id=id;
    }
}

@Entity(name = "SecondTable")
@Table(name = "SecondTable")
@AccessType("property")
public class SecondTable {
    private String _RandomCol;
    @Column(name="RandomCol")
    public java.lang.String getRandomCol() {
        return _RandomCol;
    }
    public SecondTable setRandomCol(java.lang.String value) {
        this._RandomCol = value;
        return this;
    }
    private long id;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="OId")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id=id;
    }
}

【问题讨论】:

    标签: hibernate jpa orm jpa-2.0


    【解决方案1】:

    私有瞬态 SecondTable _SecondTable;

    【讨论】:

      【解决方案2】:

      我现在正在处理同样的问题。据我了解,此回复JPA Hibernate collections not lazily loaded 如果您不想加载子级别,则不应调用 getChildren 方法。但是您似乎在尝试将对象转换为 json 时实际上调用了此方法。

      在您的情况下,如果可能,请尝试不自动将 Object 转换为 Json,而是手动填充 json 并将您实际需要的属性放在那里。如果你的情况不可能,请看这里JPA + Hibernate - How to get FK of child entity without fetching that entity?

      可能有更好的解决方案,但我没有找到。

      刚刚在这里找到了更好的方法hibernate entity to json

      【讨论】:

        【解决方案3】:

        LazyInitializationException 正在发生,因为您正试图从事务中检索子对象。即使您有detactedFirstTable 实体,它仍然是一个实体,SecondTable 实体也仍然是一个实体并被标记为未初始化。换句话说,FirstTable 实体不持有SecondTable 类,而是SecondTable 实体的代理,这就是抛出LazyInitializationException 的原因。

        如前所述,您可以通过首先将 _SecondTable 属性设置为 null 来修复它。然后 json 序列化器将忽略该属性。

        更常见的是创建 DTO 或 Data Transfer Object。这是通过制作本质上是实体的克隆的类来完成的,但只具有您想要通过 json 传输的属性。

        假设您打算使用 RESTful 服务,可能支持客户端视图框架,例如 AngularJs,那么制定 DTO 将为您省去很多麻烦。

        【讨论】:

          【解决方案4】:

          同意尼古拉斯。

          所以有一个互补的东西,在我的上一个工作中,我使用了 JACKSON 提供程序和 CXF。即使将数据子项设置为 null,提供程序也将属性序列化为“null”(例如:{data = null})。 不知道是我的错还是JACKSON-CXF这对夫妇的错。 使用像 @JsonIgnore 这样的注释可能是一个解决方案。

          但是,如果您想在一天内完全转移您的实体,那么将这种类型的注释放在您的实体上可能效率不高。也许有一天,这将是必要的。 SO 认为这样做与否。

          所以,就我而言,我决定

          1) 让没有“JSON ANNOTATION”的实体,如果需要的话,照原样传输

          2)创建一个智能的DTO/POJO来传输数据(每个需要一个DTO/POJO)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-20
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 2011-08-17
            • 1970-01-01
            • 1970-01-01
            • 2017-12-08
            相关资源
            最近更新 更多