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
Java @公式在具有对象的hibernate中不起作用_Java_Hibernate_Jpa - Fatal编程技术网

Java @公式在具有对象的hibernate中不起作用

Java @公式在具有对象的hibernate中不起作用,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个状态值很少的枚举 新建、审阅、发布、挂起、更新、垃圾邮件、重复、无关、未发布 我不想将它们作为枚举使用,因此为此创建了一个实体。为了方便起见,我想在entity中保留一列以从enum初始化status,并将该枚举值转换为status entity的对象。为了这个 我有两个实体。我想引用另一个实体中具有值的列 基本上我想用公式初始化一个对象 实体是 @Entity @Table(name = "event_status") public class EventStatus { @

我有一个状态值很少的枚举

新建、审阅、发布、挂起、更新、垃圾邮件、重复、无关、未发布

我不想将它们作为枚举使用,因此为此创建了一个实体。为了方便起见,我想在entity中保留一列以从enum初始化status,并将该枚举值转换为status entity的对象。为了这个

我有两个实体。我想引用另一个实体中具有值的列

基本上我想用公式初始化一个对象

实体是

@Entity
@Table(name = "event_status")
public class EventStatus {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="eventStatusId")
    private Integer eventStatusId;

    @Enumerated(EnumType.STRING)
    @Column(unique = true,name="eventStatusType")
    private EventStatusType eventStatusType;

    public EventStatus() {
        this(EventStatusType.NEW);
    }

    public EventStatus(EventStatusType eventStatusType) {
        super();
        this.eventStatusType = eventStatusType;
    }

    public Integer getEventStatusId() {
        return eventStatusId;
    }

    public EventStatusType getEventStatusType() {
        return eventStatusType;
    }

    public void setEventStatusId(Integer eventStatusId) {
        this.eventStatusId = eventStatusId;
    }

    public void setEventStatusType(EventStatusType eventStatusType) {
        this.eventStatusType = eventStatusType;
    }
}
我有另一个实体,我指的是这个实体的对象

@Entity
@Table(name = "event_")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Event implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id_")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Transient
    public EventStatusType eventStatusType = EventStatusType.NEW;

    @ManyToOne(fetch = FetchType.EAGER, targetEntity = EventStatus.class)
    @Formula("select * from event_status where eventStatusId= 1")
    private EventStatus status;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public EventStatus getStatus() {
        System.out.println("Event.getStatus() " + status);
        return status;
    }

    public void setStatus(EventStatus status) {
        System.out.println("Event.setStatus()");
        this.status = status;
    }
}
这不会给出任何异常,但不会初始化此值。
是否可以使用Event entity中的eventStatusType值初始化此EntityStatus?我想根据以下说明:

有时,您希望数据库为您做一些计算,而不是在JVM中,您还可以创建某种虚拟列。您可以使用SQL片段(也称为公式)而不是将属性映射到列中。此类属性是只读的(其值由公式片段计算)

SQL片段可以任意复杂,甚至包括子选择

您可以使用SQL片段使用
@JoinColumnOrFormula
/
@JoinColumnOrformulas
注释模拟物理联接列(就像您可以使用SQL片段通过
@Formula
注释模拟属性列一样)


此外,我们应该使用
insertable=false,updateable=false
,因为这样的映射是不可编辑的

@公式
必须返回通常会返回
映射的内容。所以在这种情况下,Hibernate需要获取status-ID。这应该是
@公式的结果,而不是该对象的选择……你的意思是我必须将我的sql更改为“从event_status中选择eventStatusId,其中eventStatusId=1”!这不会有帮助,因为:我们需要的是创造一些智能选择。。。事实上,我们应该说@Formula(“(1)”)。信不信由你,这对冬眠来说已经足够了。为什么?Hibernate将获取该值并使用提供的id搜索
EventStatus
。。。有道理?。你的方法是可行的,但不是我们所需要的。我们正在尝试用一些更智能的值替换该列,在DB端进行评估…不起作用,给出异常“java.sql.SQLException:Field“status”没有默认值“@Formula并不复杂。当并没有具有适当值的列时,它确实帮助我们解决了这个问题。我们可以计算它。但问题是:它可能是只读的……这些公式列是只读的。如果是这样的话,那么在我的情况下,这是没有帮助的。我想在制作和持久化外观时将枚举值更改为Object,从SQL的角度考虑。如果列已计算。。。它可以用来获取值。但是没有办法插入不可预测的源值集。。。因此,公式==只读。对不起,我想帮忙。。。享受冬眠吧;)神奇的工具手帕。如果你能帮忙的话。你能告诉我管理我的状态枚举的最佳方法吗。实际上,我希望避免在DB中使用字符串值(重复)。如果我将它们保存在DB中,那么每次我都必须通过从DB获取来设置它们。最好的使用方法是什么。不完全确定我是否理解,因为为什么没有列statusId?和标准的多对一映射?那就是我要走的路。。。此外,EventStatus应作为一个表显示在DB中。为什么?外键约束。这是我的经验。我必须说:喜欢它。运行时正常(使用enum),数据库也正常,因为即使没有代码,它也是可读的!(外键,事件状态表)。这就是我的方式,所以最后的结论是。我不能用公式解决这个问题。我必须手动维护这个东西。
@Formula("obj_length * obj_height * obj_width")
public long getObjectVolume()
@Entity
public class Ticket implements Serializable {
    @ManyToOne
    @JoinColumnOrFormula(formula="(firstname + ' ' + lastname)")
    public Person getOwner() {
        return person;
    }
    ...
}