【发布时间】:2015-03-24 16:03:21
【问题描述】:
我有一个 JpaRepository 在 Spring MVC 应用程序中持久化新创建的实体。这个实体看起来像这样(非常简化):
@Entity
public class Translation {
.....
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
private Version version;
....
}
和版本实体:
@Entity
public class Version {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "version_code")
private long code;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "version", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Translation> translations;
}
我创建一个这样的翻译对象
TranslationDTO t = new TranslationDTO();
t.setText(translationText);
ClientVersionDTO version = new ClientVersionDTO();
version.setId(11);
t.setVersion(version);
其中 11 是数据库中从一开始就存在的版本。请注意,我没有为 ClientVersionDTO 的 name 和 code 设置值。
然后我有一个持久化新对象的服务(我使用 dozer 库将 DTO 转换为实体)
@Service
@Transactional
public class TranslationsServiceImpl implements TranslationsService {
@Override
public Long create(TranslationDTO translationDTO) {
Translation translation = translationsConverter.unconvert(translationDTO);
Translation t = translationRepository.saveAndFlush(translation);
Translation t2 = translationRepository.findOne(t.getId());
// !!!! t2.getVersion() returns version where no values are set to 'code' and 'name'
return t2.getId();
}
}
请注意我的评论“t2.getVersion() 返回没有值设置为 'code' 和 'name' 的版本” - 我期待这样当我从数据库中获取数据时,我会得到一个 @987654329来自数据库的 @ 对象,设置了 code 和 name 值。但是它们没有设置。所以基本上我得到的t2.getVersion() 对象与输入参数translationDTO.getVersion() 中的对象相同。我怎样才能使Version 对象重新失效?
UPDATE 尝试将 @Transactional 移动到 JpaRepository,但结果仍然相同。
【问题讨论】:
-
您可能是指“Spring MVC”吗?那是因为你写了“Sprint MVC”
-
好的,谢谢。修改错别字。
-
尝试将您的@Transactional 移动到您的存储库进行测试
-
benjamin.d,刚刚尝试过,但没有成功。
-
找到更好的解决方案了吗?我也有类似的问题:stackoverflow.com/questions/45491551/…
标签: java jpa spring-data-jpa