【问题标题】:Getting Illegal state exception for @Transient property in Hibernate在 Hibernate 中获取 @Transient 属性的非法状态异常
【发布时间】:2016-02-12 08:41:09
【问题描述】:

我在 Model 类中有一个属性,它具有 @transient 属性,我使用了这个注解,因为我不希望它与数据库一起存在。但是在 DaoImpl 类的查询中,我在 select 子句中使用了它。所以这给了我:java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode

可能是什么原因?我不想删除@transient 注释。

    public class Hello implements Serializable{
    @JsonIgnore
    private String new;

    @Transient
    @JsonIgnore
    private String wanted;

}

DaoImpl 类中的查询

SELECT new,wanted from Hello

【问题讨论】:

  • 瞬态未保存在数据库中。阅读文档。

标签: java hibernate jpa persist transient


【解决方案1】:

您不能在查询中使用瞬态属性。

transient 的全部含义是 DB 不知道这个属性

【讨论】:

  • 但表中有该属性的列。我想获取该列,但不想在前端保存为该特定列所做的任何更改和更新以反映在数据库中。如果不在查询中使用该属性,我将如何将其发送到前端?
  • 这是您应该作为一个新问题提出的问题。并作为提示:在询问之前检查@Column(insertable=false, updatable=false)
【解决方案2】:

瞬态意味着休眠甚至不会尝试将其保存在数据库中,因此如果未保存,则无法在查询中使用。如果您检查数据库,您会发现该字段没有输入任何值,并且它甚至不应该作为列存在。它只存在于代码中。

【讨论】:

    【解决方案3】:

    默认情况下,如果可能,您类中的所有字段都将保存到数据库中。如果存在不应该记录在数据库中的字段,我们会使用 @Transient 注解标记该字段。因此数据不会被保存,这最终意味着无法获取数据

    这就是我的意思

    【讨论】:

    • 跟你说的完全相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2017-08-09
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多