Java JPA保存后不返回默认值
我面临一个问题。 A有一个实体: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;
@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
}
}
或
您需要从数据库中刷新实体,否则它将无法工作。我使用了“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标准规范不是特定于供应商的。