Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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在保存实体后,为带有@Formula注释的实体属性返回null_Java_Hibernate_Jpa_Transactions_Formula - Fatal编程技术网

Java Hibernate在保存实体后,为带有@Formula注释的实体属性返回null

Java Hibernate在保存实体后,为带有@Formula注释的实体属性返回null,java,hibernate,jpa,transactions,formula,Java,Hibernate,Jpa,Transactions,Formula,我有一个简单的类,如下所示: @Entity @Table(name = "post") public class Post { @Id @GeneratedValue Long id; @Column(name = "title") String title; @Formula("(select current_date())") Date currentDate; @OneToMany(mappedBy = "post"

我有一个简单的类,如下所示:

@Entity
@Table(name = "post")
public class Post {

    @Id
    @GeneratedValue
    Long id;

    @Column(name = "title")
    String title;

    @Formula("(select current_date())")
    Date currentDate;

    @OneToMany(mappedBy = "post")
    Set<PostComment> commentList = new HashSet<>();
}
当我检查hibernate日志时,它首先选择Post实体的所有字段,但当我调用Post.getCurrentDate时,它用@Formula注释的返回空值:

为什么它返回并记录commentList,但不返回currentDate?是冬眠虫吗

我在github中推送了完整的示例项目,您可以看到。

我编写了一个非常有用的示例项目

实体如下所示:

@Entity(name = "Event")
@Table(name = "event")
public static class Event {

    @Id
    private Long id;

    @Formula("(SELECT current_date)")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdOn;

    public Long getId() {
        return id;
    }

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

    public Date getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }
}
请注意,Date属性也使用@Temporal注释

现在,为了模拟您的用例,我编写了以下数据访问逻辑:

Event event = new Event();
event.setId(1L);

entityManager.persist(event);
entityManager.flush();

entityManager.refresh(event);

assertNotNull(event.getCreatedOn());
请注意刷新调用,这是必需的,因为实体是在持久化时缓存的,我们希望从数据库中重新提取它

在执行时,Hibernate会生成以下语句:

Query:["insert into event (id) values (?)"], Params:[(1)]
Query:["select formulacur0_.id as id1_0_0_, (SELECT current_date) as formula0_0_ from event formulacur0_ where formulacur0_.id=?"], Params:[(1)]

测试用例运行良好。只需在您的用例和我的用例之间进行一次比较调试,看看为什么您的和我的不起作用。

如果您检查hibernate日志,它会选择所有列,也会选择current_date,但为什么不设置为currentDate字段?@Generated用于计算和保存列的值,但我只想在加载对象时进行计算。我应该调试什么?在调试模式下运行查询并检查JDBC结果集包含的内容。这是查询的结果,选择post0.id作为id1\u 0\u,post0\u。标题作为title2\u 0\u,从post0\u中选择当前日期作为formula0\u 0\u,其中post0\u.id=?,它选择了所有的专栏,我更新了我的答案,并引用了GitHub上的一个测试用例,它运行得很好。
Event event = new Event();
event.setId(1L);

entityManager.persist(event);
entityManager.flush();

entityManager.refresh(event);

assertNotNull(event.getCreatedOn());
Query:["insert into event (id) values (?)"], Params:[(1)]
Query:["select formulacur0_.id as id1_0_0_, (SELECT current_date) as formula0_0_ from event formulacur0_ where formulacur0_.id=?"], Params:[(1)]