[英]Can I update only one relation (one field) using Hibernate
我有下一个关系:
@Entity
@Table(name = "STOCK", uniqueConstraints = @UniqueConstraint(columnNames = { "CODE", "INTERVAL", "DATE" }) )
public class StockEntity {
.....
many other fields like collections
.....
@ElementCollection
@CollectionTable(name = "PARAMETERS", joinColumns = @JoinColumn(name="SETTING_ID"))
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@MapKeyEnumerated(EnumType.STRING)
private Map<LocalSetting.SettingType, LocalSetting> parameters = new HashMap<>();
}
@Entity
@Table(name = "LOCAL_SETTING")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class LocalSetting {
@Id
@Column(name = "SETTING_ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long settingId;
.....
}
当我使用我的DAO时:
@Override
public void updateStocks(List<StockEntity> stocks) {
Session session = sessionFactory.getCurrentSession();
stocks.forEach(stock -> {
session.update(stock);
session.flush();
session.clear();
});
}
在日志跟踪中,我注意到将更新StockEntity中的所有字段,当我仅更改“参数”时,这意味着我也正在更新许多其他参数,我可以直接跳过这些参数
当我尝试使用下一个代码仅更新“参数”时:
@Override
public void updateParameters(List<StockEntity> stocks) {
stocks.forEach(stock -> {
for (Map.Entry<LocalSetting.SettingType, LocalSetting> entry : stock.getParameters().entrySet()) {
sessionFactory.getCurrentSession().saveOrUpdate(entry.getValue());
}
});
}
但是过程将像我将更新整个StockEntity一样,也许我可以分离另一个字段,直到完成更新“参数”
作为指定在这里
session.update()
update将一个实体作为参数。但是您要传递一个Map(我假设这是您要保存的LocalSetting
实体)。
据我所知,不可能使用update(..)方法持久保存对象集合。 尝试以下代码检查它是否适合您:
@Override
public void updateParameters(Map<LocalSetting.SettingType, LocalSetting> parameters)
{
for (Map.Entry<String, String> entry : map.entrySet())
{
sessionFactory.getCurrentSession().update(entry.getValue());
}
sessionFactory.getCurrentSession().commit();
sessionFactory.getCurrentSession().close();
}
是什么让我建议更多答案,这是您的问题( org.hibernate.MappingException
)中的异常,该异常基本上是在告诉我们我们正在更新未映射的实体。
您必须使用动态插入才能仅更新一个字段。 语法为:
@org.hibernate.annotations.Entity(
dynamicInsert = true
)
您可以在此处看到一个示例: 动态插入示例
您还可以阅读这篇文章, 为什么默认情况下休眠动态插入false以便了解dynamicInsert = true可能存在的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.