【问题标题】:Hibernate - Declaring A Transient object in a pojoHibernate - 在 pojo 中声明一个瞬态对象
【发布时间】:2010-10-08 14:10:09
【问题描述】:

我有一个 pojo,它是表 TableA 的对象 A

TableA (int a1,int a2)

为了填充表格,我运行了一个返回 (int a1, int a2, boolean b3) 的查询(并运行多个数据检查)

b3 在 TableA 中无效,但我仍然想对两者使用相同的 pojo (这是一个非常大的 pojo ,并且为了查询而拥有一个将是主要的代码重复)

我已经在pojo中声明了

@Transient
Boolean getB3() {..}
void setB3(Boolean b3) {..} 

在查询中我声明我希望得到 b3 值:

<return> ...
<return-property name="b3" column="b3"/>
...
</return>

但是 Hibernate 只是忽略了参数并且从不使用“setB3()”.. 当我删除 @Transient 时,它可以工作(然后在插入 table 时自然会失败)-所以所有名称都是正确的

我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: hibernate transient


    【解决方案1】:

    好的,不同的想法。我猜因为您将该属性标记为瞬态休眠将既不会加载也不会存储该属性。

    一种解决方案可能是创建两个类。一个没有 b 属性。第二个使用 mappedSuperclass 注释从第一个扩展。

    或者你可以尝试使用一些 formula 来映射它,它只提供一些默认值(例如 false)。因此,对于“正常”情况,您休眠将使用公式,从而产生一些默认值,而对于您的特殊查询,您可以使用该查询中的任何逻辑。

    【讨论】:

    • 关于公式 - 好主意,但它不起作用 - 因为结果基于查询中的其他字段,而这些字段不在表中。关于另一个选项,我试图避免这种情况,因为它还需要一个接口 + 2 个类,而我想要的只是一个 pojo :(
    • 两个类和一个接口有什么不好的,只要没有重复?
    • 我想我并不清楚公式化方法的含义。编辑了答案以澄清它。
    【解决方案2】:

    您的 Id 注释在哪里?它是在 getter 或 setter 上还是在字段上?

    如果是在某个字段上,hibernate 只会查看字段以查找其他注释。

    访问类型

    @Entity、@EmbeddableSuperclass、@Embeddable 中不再提供 accessType 属性。从@Id 或@EmbeddedId 注释位置猜测给定实体的访问类型。如果实体在字段上具有@Id,则访问类型将为字段,并且将读取字段上的所有注释。方法也一样。 @MappedSuperclass(以前称为@EmbeddableSuperclass)和@Embeddable 从它们的>拥有实体继承访问类型。

    禁止使用@Id 为给定实体注释字段和方法。

    如果出于某种原因您想在给定实体中或实体与其 MappedSuperclass/Embeddable 之间混合访问类型,您可以使用 Hibernate 特定的 @AccessType 注释(请参阅参考文档以获取更多信息)。

    这是来自http://www.hibernate.org/398.html

    【讨论】:

    • 我没有真正明白你在说什么,对不起
    • 我说的和其他答案基本一样
    【解决方案3】:

    您是否在字段和方法上混合了注释?

    例如,这是行不通的:

    @Entity
    public class A {
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String b;
    
        private String c;
    
        public void setB(String b) { this.b = b; }
        public String getB() { return b; }
    
        @Transient // inconsistent with other annotations
        public void setC(String c) { this.c = c; }
        public String getC() { return c; }
    }
    

    而这将:

    @Entity
    public class A {
        @Id
        @GeneratedValue
        private Long id;
    
        @Column
        private String b;
    
        @Transient // consistent with other annotations
        private String c;
    
        public void setB(String b) { this.b = b; }
        public String getB() { return b; }
    
        public void setC(String c) { this.c = c; }
        public String getC() { return c; }
    }
    

    【讨论】:

    • 不,一切都在正确的位置,但它仍然无法正常工作:(
    【解决方案4】:

    在 get 方法上尝试 @Transient ,而不是在 set 方法上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多