2015-08-11 2 views
1

В последнее время я столкнулся с странным явлением с данными 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(); 

Это, надеюсь, действительный способ, чтобы удалить их;)

+0

Проверьте, поможет ли это вы http://coderclubs.com/questions/5096174/hibernate-one-to-many-relation-foreign-key-always-null –

+0

@SubodhJoshi Спасибо, но это не проблема. Миллионы записей вставлены правильно; но иногда эти сироты происходят. Отношение есть только один путь. –

+0

@UweAllner вы нашли решение этой проблемы или знаете, что ее вызывает? Если да, можете ли вы дать ответ на свой вопрос здесь? – myhau

ответ

0

Если я правильно понимаю, что вы используете FetchType.LAZY - это означает, что данные будут получены только во время сеанса, вы можете использовать Hibernate.initialize для получения полей @OneToMany или можете использовать FetchType.EAGER вместо FetchType.LAZY

+0

Но это не объясняет, почему у меня есть записи с product_id null в базе данных. Записи с ненулевыми значениями загружаются правильно, если они ленивы или нет. –

Смежные вопросы