我正在向我现有的 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/