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?