2

我有一个 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 时自然会失败) - 所以所有名称都是正确的

我怎样才能解决这个问题?

谢谢!

4

4 回答 4

3

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

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

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

于 2009-03-03T19:04:04.630 回答
0

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

如果它在一个字段上,休眠将只查看字段以查找其他注释。

访问类型

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

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

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

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

于 2009-02-19T13:20:33.103 回答
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; }
}
于 2009-02-19T13:24:54.793 回答
0

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

于 2015-01-05T17:40:11.663 回答