繁体   English   中英

JPA 保存后不返回默认值

[英]JPA does not return default value after saving

我遇到了一个问题。 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 function now() 设置,但在创建的实体中不由 JPA 返回。

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

保存到数据库后需要refresh数据,得到object最新的state,如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
   }
}

您可以使用注释 @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();
         }
        
        }
@Entity
@Table(name = "user")
public class User {

  @Id
  @GeneratedValue
  private Integer id;

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

}

要么

private LocaleDateTime dateCreate;
  1. LocaleDate 是在没有时间的情况下将日期存储到数据库中。
  2. LocaleDateTime 将日期和时间存储到数据库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM