问题:未使用迁移查询的默认值创建 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 DB(用于 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;

解答

默认值仅适用于数据库。

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

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐