Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 JPA保存后不返回默认值_Java_Spring_Postgresql_Jpa_Spring Data Jpa - Fatal编程技术网

Java JPA保存后不返回默认值

Java JPA保存后不返回默认值,java,spring,postgresql,jpa,spring-data-jpa,Java,Spring,Postgresql,Jpa,Spring Data Jpa,我面临一个问题。 A有一个实体: @Entity @Table(name = "user") public class User { @Id @GeneratedValue private Integer id; @Column(name = "date_create", insertable = false, updatable = false, nullable = false) private Date dateCreate;

我面临一个问题。 A有一个实体:

@Entity
@Table(name = "user")
public class User {

  @Id
  @GeneratedValue
  private Integer id;

  @Column(name = "date_create", insertable = false, updatable = false, nullable = false)
  private Date dateCreate;

}
相关表的DDL:

CREATE TABLE user (
  id SERIAL PRIMARY KEY,
  date_create TIMESTAMP NOT NULL DEFAULT now()
);
我有这样的逻辑:

@Service
public class Service1 {

  @Autowired
  private UserRepository userRepository;

  @Transactional
  public User createUser() {
    return userRepository(new User());
  }
 }

 @Service
 public class Service2 {

   @Autowired
   private Service1 service1;

   public void createUser() {
     User createdUser = service1.createUser();
     System.out.println(createdUser.getDateCreate()); // actual result : null
   }
  }
字段dateCreate由DB函数now()设置,但JPA不会在创建的实体中返回该字段


有人知道如何解决这个问题吗?不使用Hibernate或Spring特定工具。只需JPA。

您可以使用anotation@PrePersist在持久化之前创建日期

    @Entity
    @Table(name = "user")
    public class User {
    
          @Id
          @GeneratedValue
          private Integer id;
        
          @Column(name = "date_create")
          @Temporal(TemporalType.TIMESTAMP)
          private Date dateCreate;


          @PrePersist
          private void onCreate() {
          dateCreate= new Date();
         }
        
        }

您可以使用anotation@PrePersist在持久化之前创建日期

    @Entity
    @Table(name = "user")
    public class User {
    
          @Id
          @GeneratedValue
          private Integer id;
        
          @Column(name = "date_create")
          @Temporal(TemporalType.TIMESTAMP)
          private Date dateCreate;


          @PrePersist
          private void onCreate() {
          dateCreate= new Date();
         }
        
        }

在将数据保存到数据库后,您需要
刷新
数据并获取对象的最新状态,如
entityManager.refresh(createdUser)

您可以使用它,如下所述

 @Service
 public class Service2 {

   @Autowired
   private Service1 service1;

   @PersistenceContext
   private EntityManager entityManager;

   public void createUser() {
     User createdUser = service1.createUser();
     entityManager.refresh(createdUser);
     System.out.println(createdUser.getDateCreate()); // actual result : null
   }
}

在将数据保存到数据库后,您需要
刷新
数据并获取对象的最新状态,如
entityManager.refresh(createdUser)

您可以使用它,如下所述

 @Service
 public class Service2 {

   @Autowired
   private Service1 service1;

   @PersistenceContext
   private EntityManager entityManager;

   public void createUser() {
     User createdUser = service1.createUser();
     entityManager.refresh(createdUser);
     System.out.println(createdUser.getDateCreate()); // actual result : null
   }
}

  • LocaleDate是将日期存储到数据库中而不使用时间
  • LocaleDateTime将日期和时间存储到数据库中
  • LocaleDate是将日期存储到数据库中而不使用时间
  • LocaleDateTime将日期和时间存储到数据库中

  • 您需要从数据库中刷新实体,否则它将无法工作。我使用了“saveAndFlush”,但它对我没有帮助(我可以在不调用其他查询的情况下获取实际实体数据吗?
    createdUser=userRepository.saveAndFlush(createdUser);
    ?如前所述,使用刷新(这是entitymanager上的一个实际方法).“saveAndFlush”对我没有帮助(由EntityManager刷新完成了!谢谢!您需要从数据库刷新实体,否则它将无法工作。我使用了“saveAndFlush”,但它对我没有帮助(我可以在不调用其他查询的情况下获取实际实体数据吗?
    createdUser=userRepository.saveAndFlush(createdUser);
    ?如上所述,使用刷新(这是entitymanager上的一个实际方法)。“saveAndFlush”对我没有帮助(从entitymanager刷新完成了!谢谢!谢谢你的回答!我考虑过了。但是我们使用了“default now”()'在DDL中,我们依赖于此。可能还有其他解决方案可以返回实际的'dateCreate'值吗?我使用了Hibernate中的@CreationTimestamp,它工作得很好。但我不想与特定的JPA实现功能捆绑在一起。您可以尝试在更新后调用方法refresh。顺便说一句,注释@PrePersist是t的一部分JPA标准规范不是特定于供应商的。谢谢你的回答!我考虑过了。但是我们使用了'default now()'在DDL中,我们依赖于此。可能还有其他解决方案可以返回实际的'dateCreate'值吗?我使用了Hibernate中的@CreationTimestamp,它工作得很好。但我不想与特定的JPA实现功能捆绑在一起。您可以尝试在更新后调用方法refresh。顺便说一句,注释@PrePersist是t的一部分JPA标准规范不是特定于供应商的。