未使用迁移查询的默认值创建 JPA 实体
问题:未使用迁移查询的默认值创建 JPA 实体 我正在向我现有的user表添加一个新列signature- 使用 FlyawayDB 进行数据库迁移 - 新列对于新用户和现有用户都将具有默认值。但是,我注意到当我尝试创建和保存新用户时,该字段由于某种原因为空。 我不知道这是否是一些缓存问题(例如,它在执行我的V2__adding_signature.sql迁移查询之前使用了用户对象的某个版本)还是
·
问题:未使用迁移查询的默认值创建 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;
解答
默认值仅适用于数据库。
插入后,您必须刷新实体以从数据库中获取插入的默认值。
更多推荐
已为社区贡献19912条内容
所有评论(0)