Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate-在pojo中声明临时对象_Hibernate_Transient - Fatal编程技术网

Hibernate-在pojo中声明临时对象

Hibernate-在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值:

我有一个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值:

<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个类和一个接口有什么不好,只要没有重复?我想我不清楚我对公式化方法的意思。编辑了答案以澄清它。