java - 未使用迁移查询的默认值创建 JPA 实体

标签 java spring postgresql hibernate jpa

我正在向我现有的 user 表添加一个新列 signature -- 使用 FlyawayDB 进行数据库迁移 -- 其中新列将具有默认值,对于新用户和现有用户。但是,我注意到当我尝试创建和保存新用户时,由于某种原因该字段为空。

我不知道这是缓存问题(例如,在执行我的 V2__adding_signature.sql 迁移查询之前它使用了某个版本的用户对象)还是其他问题。

这是我的:

实体

@Entity
@Table(name = "users")
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@DynamicUpdate
public class UserEntity {
  @Id private String userId;

  @Column(insertable = false, updatable = false)
  private String signature;

  public UserEntity(String userId) {
    this.userId = userId;
  }
}

服务

@Service
@AllArgsConstructor
public class UserService {

  private final UserRepository userRepo;

  @Transactional
  public UserEntity createUser(String userId) {
    UserEntity userEntity = new UserEntity(userId);
    userRepo.saveAndFlush(userMappingEntity);
    return userEntity; // this will not have a the default signature created
  }
}

存储库

@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {

....
}

在我的 db.migration 文件夹中设置初始 PostGres 数据库(用于 Flywaydb)

V1__initial_creation.sql

CREATE TABLE IF NOT EXISTS users (
  user_id TEXT PRIMARY KEY
);

V2__adding_signature.sql

ALTER TABLE users
    ADD COLUMN signature TEXT NOT NULL DEFAULT 'testValueForNow';

编辑_1:

我也试过使用 EntityManager 来刷新我的实体,就像这样

  @PersistenceContext private EntityManager entityManager;

      @Transactional
      public UserEntity createUser(String userId) {
        UserEntity userEntity = new UserEntity(userId);
        userRepo.saveAndFlush(userEntity);
        entityManager.refresh(userEntity);

        return userEntity; // this will not have a the default signature created
      }

但是这似乎也不起作用,并给我以下错误:java.lang.IllegalArgumentException: Entity not managed

编辑_2: 感谢用户@Simon Martinelli

我必须执行以下操作才能使其正常工作:

   UserEntity userEntity = new UserEntity(userId);
   userEntity = userRepo.saveAndFlush(userEntity);
   entityManager.refresh(entityManager.merge(userEntity));
   return userEntity;

最佳答案

默认值仅适用于数据库。

插入后,您必须刷新实体才能从数据库中获取插入的默认值。

关于java - 未使用迁移查询的默认值创建 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63523314/

相关文章:

postgresql - 在 postgresql jsonb 中存储外键是一个坏主意吗?

postgresql - 如何将表参数传递给此函数?

java - 就性能和可靠性而言,Java 的最佳 HTTP 库是什么?

sql - 将查询从 MSSQL 转换为 PostgreSQL

java - Apache HttpClient 4.3 和 x509 客户端证书进行身份验证

java - Spring - 两个实现之间的运行时选择

java - 具有大量参数的 HTTP.GET 操作 Spring Rest

java - 使用restful web服务代替soap,而不改变请求的用户部分

java - 将 java.math.BigDecimal 转换为 scala.math.BigDecimal?

java - 如何在不使用 ArrayList 的情况下在数组中添加两个单独的对象?