代码之家  ›  专栏  ›  技术社区  ›  Yossale

休眠-在POJO中声明临时对象

  •  2
  • Yossale  · 技术社区  · 15 年前

    我有一个POJO,是表A的对象A

    TableA (int a1,int a2) .

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

    b3在Tablea中无效,但我仍然希望对两者都使用相同的pojo(这是一个非常大的pojo,并且仅为了查询而使用一个pojo将是一个主要的代码复制)

    我已经在POJO中声明了

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

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

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

    但是Hibernate只是忽略参数,从不使用“setb3()”。 当我删除@transient时,它会工作(然后在插入表时自然会失败),所以所有的名称都是正确的。

    我怎么修这个?

    谢谢!

    4 回复  |  直到 9 年前
        1
  •  3
  •   Dave Rager    12 年前

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

    一种解决方案是创建两个类。一个没有B属性。以及第二个使用mappedsuperclass注释从第一个扩展而来。

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

        2
  •  0
  •   Jens Schauder    15 年前

    你的ID注释在哪里?它是在一个getter或setter上,还是在一个字段上?

    如果它在字段上,Hibernate将只查看字段以查找其他注释。

    访问类型

    accessType属性在@entity、@embeddablesuperclass、@embeddable中不再可用。给定实体的访问类型是从@id或@embeddedid注释位置猜测出来的。如果一个实体在一个字段上有@id,那么访问类型将是字段,所有注释将在字段上读取。方法也一样。@mappedsuperclass(以前称为@embeddablesuperclass)和@embeddable从其所属实体继承访问类型。

    禁止为给定实体同时用@id注释字段和方法。

    如果出于某种原因,您希望混合给定实体中的访问类型或实体与其映射的超类/可嵌入的访问类型,则可以使用Hibernate特定的@AccessType注释(有关详细信息,请参阅参考文档)。

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

        3
  •  0
  •   toolkit    15 年前

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

    例如,这不起作用:

    @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
  •  0
  •   Jeryl Cook    9 年前

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