【发布时间】:2014-06-11 12:41:21
【问题描述】:
假设我有两个班级
@Entity
public class Product{
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Provider provider;
//getter & setter
}
@Entity
public class Provider{
@Id
@GeneratedValue
private Long id;
private String name
//getter & setter
}
以及对应的DTO
public class ProductDTO{
private Long id;
private String name;
private ProviderDTO provider;
//getter & setter
}
为了简化 ProductDTO 和 product 具有相同的属性,我使用 dozer Mapping 将实体映射到 DTO 并将其发送到视图。我有一个视图,用户只能在 productDTO.name 中进行更改(这是一个更新),当他将更改发送到服务器时,我会做出类似
ProductServices.update(productDTO);
ProductServices 有
@Transactional
public void update(ProductDTO p){
Product p = DozerMapper.map(productDTO,ProductDTO.class);
productDao.update(p);
}
productDao 内部(我使用的是spring,所以我正在注入sessionFactory 并在做,ProductServices 有@Transactioanl 注释)
this.getCurrentSession().update(p);
所以 Hibernate 进行更新并设置 provider_id=null,我知道这是正确的,因为我发送到 ProductServices.update 的产品没有设置提供程序,Hibernate 将使用该产品没有提供者在数据库中更新它。 问题是我不确定如何解决这个问题,我是 hibernate 的新手,我发现的唯一解决方案是逐个字段执行选择和检查,看看什么值发生了变化,但是如果,例如,我有一个更复杂的对象,我将不得不编写大量代码来检查每个字段。
有人知道更好的解决方案或我如何修改 mi 代码以正确处理这种情况?
我正在使用 Spring 3.1 和休眠 3.6。
提前致谢。
【问题讨论】:
-
ProductDTO是@Entity但Provider不是? -- 这是故意的还是错误的? -
改了,是版本错误
标签: java spring hibernate jpa dto