2009-02-19 58 views
2

我有一个POJO即对象A,表表A休眠 - 声明一个瞬态对象在POJO

TableA (int a1,int a2)的。

为了填补这个表我运行一个查询,返回(INT A1,INT A2,布尔B3)(并运行多个数据检查)

B3是不是在表A有效,但我还是想用相同POJO两个(这是一个非常大的POJO,这将是一个重大的重复代码有一个只为查询的缘故)

我在POJO

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

而在宣布查询我宣布我期望获得b3值:

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

但是Hibernate的只是忽略的参数,并从不使用“setB3()” .. 当我删除了@Transient,它的工作原理(然后失败插入到表时,自然) - 使所有的名字都是正确

我该如何解决这个问题?

谢谢!

回答

3

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

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

或者您可以尝试将它与一些仅提供一些默认值(例如false)的formula进行映射。因此,对于'正常'的情况你休眠会使用公式,导致一些默认值,并为您的特殊查询使用该查询中的任何逻辑。

0

你的Id注释在哪里?它是在吸气剂还是吸气剂上,还是在场上?

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

访问类型

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

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

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

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

+0

我没有真正明白你在说什么,我很抱歉 – Yossale 2009-03-03 15:11:02

+0

我说的基本上与其他答案相同 – 2009-03-03 18:54:06

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; } 
} 
+0

不,一切都在它正确的地方,但它仍然不起作用:( – Yossale 2009-03-03 14:01:20

0

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