【发布时间】:2020-08-21 12:54:14
【问题描述】:
我在现有的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';
EDIT_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
EDIT_2: 感谢用户@Simon Martinelli
我必须执行以下操作才能使其正常工作:
UserEntity userEntity = new UserEntity(userId);
userEntity = userRepo.saveAndFlush(userEntity);
entityManager.refresh(entityManager.merge(userEntity));
return userEntity;
【问题讨论】:
标签: java spring postgresql hibernate jpa