В последнее время я столкнулся с странным явлением с данными Hibernate/Postgres. В неизвестных условиях Hibernate создает сирот дочерних объектов (поле нулевого внешнего ключа для родителя). Но я аннотировал отношение @OneToMany как orphanRemoval.Hibernate иногда оставляет пустые поля внешнего ключа в дочерних объектах
"Основной" объект:
@Entity
@Audited
public class Product {
@NotNull(groups = { CheckId.class })
@NotBlank(groups = { CheckId.class })
@Id
@Column(length = 32)
private String id = IdGenerator.createId();
@Version
private Integer version;
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name=Product.PRODUCT_ID)
@Index(name="idx_prod_ident")
private Set<Identifier> identifiers;
...
}
Один ребенок лицо:
@Entity
@Audited
public class Identifier {
@NotNull(groups = { CheckId.class })
@NotBlank(groups = { CheckId.class })
@Id
@Column(length = 32)
private String id = IdGenerator.createId();
@Version
private Integer version;
@NotNull
@Column(nullable=false, length=3)
@Index(name = "idx_id_prod_type")
private String type;
@NotNull
@Column(nullable=false, length=65)
@Index(name = "idx_id_prod_value")
private String value;
...
}
Есть много таких @OneToMany отношений с различными (но структурно подобных) объектов в продукте. Миллионы записей написаны правильно, но в большинстве из них я иногда встречаю несколько сотен с помощью product_id null. Как это возможно?
К сожалению, я не могу легко определить, когда это произойдет (из-за отсутствия product_id). Кроме того, product_id не входит в таблицу истории Envers дочерних объектов. Поэтому я не могу проверить, существует ли продукт по-прежнему, и что с ним сделали в последнее время.
Для справки: когда ребенок объект удаляется от родителя, это делается с помощью
product.getIdentifiers.remove(identifier);
or
product.getIdentifiers.removeAll(identifiers);
or
product.getIdentifiers.clear();
Это, надеюсь, действительный способ, чтобы удалить их;)
Проверьте, поможет ли это вы http://coderclubs.com/questions/5096174/hibernate-one-to-many-relation-foreign-key-always-null –
@SubodhJoshi Спасибо, но это не проблема. Миллионы записей вставлены правильно; но иногда эти сироты происходят. Отношение есть только один путь. –
@UweAllner вы нашли решение этой проблемы или знаете, что ее вызывает? Если да, можете ли вы дать ответ на свой вопрос здесь? – myhau