【问题标题】:Polymorphic association in static metamodel JPA静态元模型 JPA 中的多态关联
【发布时间】:2015-09-24 07:36:05
【问题描述】:

我有一个包含与少数实体的多态关联的实体。它的定义:

@Entity
@Table(name = "notifications")
public class Notification implements java.io.Serializable {

//some fields ...

//Polymorphic association
@Any (metaColumn = @Column(name = "target_type"), fetch = FetchType.LAZY)
@AnyMetaDef(idType = "integer", metaType = "string",
        metaValues = {
        @MetaValue(targetEntity = Task.class, value = "Task"),
        @MetaValue(targetEntity = AdminNote.class, value = "AdminNote"),
        @MetaValue(targetEntity = UserCancelRequest.class, value = "UserCancelRequest"),
        //@MetaValue(targetEntity = TransferInfo.class, value = "TransferInfo"),
        //@MetaValue(targetEntity = NoteSubscription.class, value = "NoteSubscription")
})
@JoinColumn(name = "target_id")
@Getter
@Setter
private NotificationAssociation target;

接口NotificationAssociation表示的我的多态关联:

public interface NotificationAssociation {
/**
 * Return actual type of associated entity
 * @return one of {@link NotificationTargetType}
 */
String getTargetType();

/**
 * Return associated entity id. Used in queries
 * @return target entity id
 */
Integer getTargetId();
}

这行得通。但我需要通过静态元模型 API 从标准中的 Notification 类访问 target。我的元模型:

@StaticMetamodel(Notification.class)
public class Notification_ {
public static volatile SingularAttribute<Notification, Integer> id;
public static volatile SingularAttribute<Notification, Integer>   postedById;
public static volatile SingularAttribute<Notification, Integer> adminId;
public static volatile SingularAttribute<Notification, NotificationAssociation> target;
public static volatile SingularAttribute<Notification, Date> hiddenAt;
public static volatile SingularAttribute<Notification, Date> createdAt;

}

在 HQL/JPQL 我可以访问它, 但在元模型中 target 为空,当我通过 Root#getModel() 获取模型时,属性列表中不存在 target 。 我的问题是我可以这样做还是有其他解决方案。感谢您的帮助

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

    我很确定您解决了您的问题,但我最近遇到了同样的问题。 就我而言,我真的需要使用 CriteriaAPI,因为我有一些通用的处理来创建规范。 由于 HQL 对我来说不是一个选项,我们不能将 HQL 与规范混合。 我通过两次映射列来解决这个问题。使用您的示例:

    @Any (metaColumn = @Column(name = "target_type"), fetch = FetchType.LAZY)
    @AnyMetaDef(idType = "integer", metaType = "string",
            metaValues = {
            @MetaValue(targetEntity = Task.class, value = "Task"),
            @MetaValue(targetEntity = AdminNote.class, value = "AdminNote"),
            @MetaValue(targetEntity = UserCancelRequest.class, value = "UserCancelRequest")
    })
    @JoinColumn(name = "target_id")
    @Getter
    @Setter
    private NotificationAssociation target;
    
    @Column(name = "target_id", insertable = false, updatable = false)
    private Integer targetId;
    

    进行小调整后,将为 targetId 字段生成元数据,并在 Criteria API 上可用。那么你可以这样做:

    notificationService.getAll((root, query, cb) -> cb.and(cb.equals(root.get("targetId"), someId), ...))
    

    我希望这对面临同样问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      我想我明白了。由 Hibernate 而非 JPA 提供的 @Any 注释及其相关(@AnyMetadef 和其他)。所以我们不能使用 JPA Criteria API 来管理这种关系,但是我们可以使用 Hibernate Criteria API 来代替。

      【讨论】:

      猜你喜欢
      • 2012-02-05
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      相关资源
      最近更新 更多