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 {
...
}
我有一个域模型,其中包含一些泛型,我试图将其放入 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 {
...
}