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