gpt4 book ai didi

java - hibernate 更新为空,然后尝试通过更新的列删除

转载 作者:行者123 更新时间:2023-12-04 18:43:55 26 4
gpt4 key购买 nike

我只想从数据库中删除那些未使用的属性(orphanRemoval=true)。
我得到的是它首先尝试更新引用 PRODUCT_ID,然后删除它。但由于引用是键的一部分,它不能。

家长:

    @Entity
@Table(name = "STYLE")
public class Style implements IterableById, Serializable {
...
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="PRODUCT_ID", referencedColumnName = "PRODUCT_ID")
private List<Attribute> attributes;
...

它的 child
    @Entity
@Table(name="ATTRIBUTE")
public class Attribute{
@EmbeddedId
private Id id;
...

@Embeddable
public static class Id implements Serializable{

private static final long serialVersionUID = -8631874888098769584L;

@Column(name="PRODUCT_ID")
protected Long productId;

@Column(name="NAME")
protected String name;

@Column(name="COUNTRY_CODE")
protected String countryCode;
...

在我获取属性列表并清除之后,然后尝试提交我得到
    ...
Hibernate: update ATTRIBUTE set PRODUCT_ID=null where PRODUCT_ID=?
Hibernate: delete from ATTRIBUTE where COUNTRY_CODE=? and NAME=? and PRODUCT_ID=?
javax.persistence.RollbackException: Error while committing the transaction
Caused by: javax.persistence.OptimisticLockException: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
...

有谁知道为什么 Hibernate 尝试先更新引用,然后将其删除。我能不能以某种方式阻止它。我想要的是那些没有使用的 child (属性)必须被删除,而不仅仅是删除引用。
...

最佳答案

我有类似的问题。使用“ updatable = false ”对我有用。

你可以试试下面的代码:

@OneToMany(fetch = FetchType.LAZY,  cascade=CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "PRODUCT_ID", updatable = false)
private Set<Attribute> attributes

关于java - hibernate 更新为空,然后尝试通过更新的列删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24019427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com