Hibernate - 在pojo中声明一个瞬态对象

时间:2009-02-19 13:00:11

标签: hibernate transient

我有一个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时,它可以工作(然后在插入表时自然失败) - 所以所有名称都是正确的

我该如何解决这个问题?

谢谢!

4 个答案:

答案 0 :(得分:3)

好的,不同的想法。我想因为你将属性标记为瞬态hibernate既不加载也不存储属性。

一种解决方案可能是制作两个班级。一个没有b属性。第二个使用mappedSuperclass注释从第一个扩展。

或者您可以尝试将其映射到只提供一些默认值(例如false)的formula。所以对于'普通'情况,你休眠将使用公式,产生一些默认值,对于你的特殊查询,你使用该查询中的任何逻辑。

答案 1 :(得分:0)

您的Id注释在哪里?它是在吸气剂或二传手上还是在场上?

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

  

访问类型

     

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

     

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

     

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

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

答案 2 :(得分:0)

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

例如,这不起作用:

@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; }
}

答案 3 :(得分:0)

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