JPA OneToMany с унаследованными сущностями, использующими DiscriminatorOptions и orphanremoval - PullRequest
4 голосов
/ 17 октября 2011

У меня проблема, которую я не могу решить уже несколько дней. Я прочитал много документов, искал много форумов, но не нашел решения. Я унаследовал класс, как показано ниже:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "nc_linktype", discriminatorType = DiscriminatorType.STRING)
@Table(name = "mk_newsletter_coupons")
@DiscriminatorOptions(force = true)
public class BaseNewsletterCoupon extends BaseEntity {...}

@Entity
@DiscriminatorValue("expire")
public class NewsletterCouponsExpire extends BaseNewsletterCoupon {

@Entity
@DiscriminatorValue("region")
public class NewsletterCouponsRegion extends BaseNewsletterCoupon {

Я хотел бы использовать эти конкретные сущности во многих аспектах реалий OneToMany:

@Entity(name = "newsletter")
@Table(name = "mk_newsletters")
@Configurable
public class NewsLetter extends BasePictureEntity {

    @OneToMany(mappedBy = "newsletter", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY)
    @IndexColumn(name = "nc_index")
    @OrderColumn(name = "nc_index")
    @OrderBy("index")
    List<NewsletterCouponsExpire> expireCoupons = new ArrayList<NewsletterCouponsExpire>();

    @OneToMany(mappedBy = "newsletter", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY)
    @IndexColumn(name = "nc_index")
    @OrderColumn(name = "nc_index")
    @OrderBy("index")
    List<NewsletterCouponsRegion> regionCoupons = new ArrayList<NewsletterCouponsRegion>();

Когда я сохраняю эту новостную рассылку, все записи создаются красиво. Если я изменю содержимое списка, кажется, что атрибут orphanRemoval = true не действует, потому что старые записи остаются в таблице, а новые создаются. Если я удаляю аннотацию @DiscriminatorOptions из базовой сущности, старые записи удаляются, но дискриминатор наследования больше не работает, поэтому провайдер JPA (hibernate) пытается загрузить каждую дочернюю запись в каждую коллекцию, что приводит к организации .hibernate.loader.Loader.instanceAlreadyLoaded исключение.

Кто-нибудь успешно внедрил подобную модель или знает какой-нибудь обходной путь для этой проблемы?

1 Ответ

0 голосов
/ 18 марта 2013

Вы можете попробовать использовать нативную аннотацию @Cascade в Hibernate с удаленным каскадным удалением вместо удаленного удаления JPA. Есть вероятность, что это сработает.

Дайте мне знать, сработало ли это для вас.

...