我有一个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时,它可以工作(然后在插入表时自然失败) - 所以所有名称都是正确的
我该如何解决这个问题?
谢谢!
答案 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>
答案 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方法。