JPA 延迟加载和泛型

JPA lazy loading and Generics

我有一个域模型,其中包含一些泛型,我试图将其放入 JPA 中。我的示例是事件域,您可以在其中拥有诸如音乐会之类的事件和诸如 ConcertTickets 之类的门票。

事件:

@Entity
@Inheritance
@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING, name="s_discriminator")
public abstract class Event {
...
}

音乐会:

@Entity
@Inheritance
@DiscriminatorValue("Concert")
public class Concert extends Event {
...
}

门票:

@Entity
@Inheritance
@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING, name="s_discriminator")
public abstract class Ticket<E extends Event> {

  ...

  @ManyToOne(targetEntity=Event.class)
  private E event;

  public E getEvent() {
    return event;
  }
}

音乐会门票:

@Entity
@Inheritance
@DiscriminatorValue("Concert")
public class ConcertTicket extends Ticket<Concert> {
    ...
}

服务:

ConcertTicket ticket = dao.findTicket(id);
Concert concert = ticket.getConcert();

这行得通。 targetEntity 是必需的,否则我会收到以下错误:

Property Ticket.event has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

到目前为止,我的模型没有遇到任何问题。但是我发现我的表现并不好。解决方案是将票证和事件之间的关系转换为延迟加载:

  @ManyToOne(targetEntity=Event.class, fetch=FetchType.LAZY)
  private E event;

问题来了。当我调用上面发布的服务时,出现以下异常:

java.lang.ClassCastException: Event_$$_jvst610_48 cannot be cast to Concert

在运行时,泛型一无所知。因此,当 JPA 实现 (Hibernate) 创建 "event" 的实例时,没有可用信息表明它实际上是 "Concert"。因此,创建了 "Event" 而不是 "Concert" 的子类。

有人能解决这个问题吗?我知道有 2 个明显的解决方案:a) 避免泛型 b) 使用预先加载。我希望找到一个可以同时保留两者的解决方案。

有同样的问题,用 @Proxy(lazy=false) 注释超类就可以了。您可以尝试以下方法,但不确定是否能挽救您的目的。

@Proxy(lazy=false)
public abstract class Event {
 ...
}