簡體   English   中英

我可以使用Hibernate僅更新一個關系(一個字段)嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM