Hibernate-在pojo中声明临时对象
我有一个pojo,它是表a的对象aHibernate-在pojo中声明临时对象,hibernate,transient,Hibernate,Transient,我有一个pojo,它是表a的对象a 表A(int a1、int a2) 为了填充表,我运行了一个返回(inta1、inta2、booleanb3)的查询(并运行多个数据检查) b3在TableA中无效,但我仍然希望对两者使用相同的pojo(这是一个非常大的pojo,仅为了查询而使用一个pojo将是一个主要的代码重复) 我已在pojo中声明 @Transient Boolean getB3() {..} void setB3(Boolean b3) {..} 在查询中,我声明我希望得到b3值:
表A(int a1、int a2)
为了填充表,我运行了一个返回(inta1、inta2、booleanb3)的查询(并运行多个数据检查)
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时,它会工作(然后在插入到表中时自然会失败)——因此所有的名称都是正确的
我怎样才能解决这个问题
谢谢 您的Id注释在哪里?它是在一个接球手或二传手上,还是在一个场地上 如果它位于字段上,hibernate将只查看字段以查找其他注释 访问类型 accessType属性在@Entity、@EmbeddedableSuperClass、@Embeddeble中不再可用。给定实体的访问类型是从@Id或@EmbeddedId注释位置猜测出来的。如果一个实体在一个字段上有@Id,那么访问类型将是field,并且所有注释都将在字段上读取。方法也一样@MappedSuperclass(以前的@EmbeddedBleSuperClass)和@Embeddeble从它们的>所属实体继承访问类型 禁止使用@Id为给定实体同时注释字段和方法 如果出于某种原因,您希望在给定实体中或实体与其MappedSuperclass/Embeddeble之间混合访问类型,可以使用特定于Hibernate的@AccessType注释(有关详细信息,请参阅参考文档)
这是来自您是否对字段和方法进行了混合注释 例如,这不起作用:
@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; }
}
好吧,不同的想法。我猜,由于您将属性标记为瞬态休眠,因此不会加载或存储该属性 一种解决方案是创建两个类。一个没有b属性。第二个使用mappedSuperclass注释从第一个扩展而来
或者,您可以尝试将其映射为仅提供某些默认值的值(例如false)。因此,对于“正常”情况,hibernate将使用公式,从而产生一些默认值,对于特殊查询,您将使用该查询中的任何逻辑。尝试@Transient,使用get方法,而不是set方法。不,一切都在正确的位置,但仍然不起作用:(我没有真正理解你所说的,很抱歉,我说的基本上和其他回答者一样,关于这个公式-好主意,但它不起作用-因为结果基于查询中的其他字段,而这些字段不在表中。关于另一个选项,我试图避免这种情况,因为它还需要一个接口+2类我想要的是一个pojo:(2个类和一个接口有什么不好,只要没有重复?我想我不清楚我对公式化方法的意思。编辑了答案以澄清它。