Association mapping override in SINGLE_TABLE inheritance

Viewed 121

I have the following entities setup:

package demo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import static javax.persistence.FetchType.LAZY;

@Entity
@Data
public class Item {
    @Id
    private String id;

    private String name;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "specialItemGroup")
    private SpecialItemsGroup specialItemGroup;
}
package demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.DiscriminatorOptions;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import java.util.HashSet;
import java.util.Set;

import static javax.persistence.DiscriminatorType.STRING;
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.InheritanceType.SINGLE_TABLE;

@Data
@Entity
@Table(name = "items_group")
@NoArgsConstructor
@AllArgsConstructor
@Inheritance(strategy = SINGLE_TABLE)
@DiscriminatorColumn(
    name = "type",
    discriminatorType = STRING
)
@DiscriminatorOptions(force = true)
@DiscriminatorValue("ITEMS_GROUP")
@SuperBuilder
public class ItemsGroup {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
        name = "UUID",
        strategy = "org.hibernate.id.UUIDGenerator"
    )
    @Column(name = "id", updatable = false, nullable = false)
    private String id;
    private String name;

    @ManyToMany(fetch = LAZY)
    @JoinTable(
        name = "items_group_item",
        joinColumns = @JoinColumn(name = "items_group_id"),
        inverseJoinColumns = @JoinColumn(name = "items_id")
    )
    private Set<Item> items = new HashSet<>();
}
package demo;

import lombok.Data;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

import java.util.Set;

import static javax.persistence.FetchType.LAZY;

@Data
@DiscriminatorValue("SPECIAL")
@Entity
public class SpecialItemsGroup extends ItemsGroup {
    @OneToMany(mappedBy = "specialItemGroup", fetch = LAZY)
    private Set<Item> items;
}

Spring data repository:

package demo;

import org.springframework.data.repository.PagingAndSortingRepository;

public interface ItemsGroupRepository extends PagingAndSortingRepository<ItemsGroup, String> {

}

When I try to fetch the ItemsGroup entities via ItemsGroupRepository I can see that overridden association in SpecialItemsGroup is ignored and items_group_item table is used instead to fetch related items.

I tried @AssociationOverride annotation and @Access(PROPERTY) but none of them resolve the problem. Is it possible to override the association mapping with SINGLE_TABLE inheritance?

1 Answers

Overriding this mapping is not possible. Rename the association in SpecialItemsGroup to e.g. specialItems.

Related