当前位置: 首页 > 面试题库 >

如何在JPA中映射自定义集合?

鲁鸿
2023-03-14
问题内容

我在使用JPA(Hiberante提供程序)映射自定义集合时遇到问题。例如,当我使用带有属性的对象时

List<Match> matches;

<one-to-many name="matches">
    <cascade>
        <cascade-all />
    </cascade>
</one-to-many>

在我的ORM文件中,没关系;但是如果我替换 “列表匹配项”; 通过

private Matches matches;

,其中 “匹配” 的定义如下:

public class Matches extends ArrayList<Match> {

    private static final long serialVersionUID = 1L;
}

它产生以下错误:

Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: by.sokol.labs.jpa.MatchBox.matches

感谢您的关注!


问题答案:

可以,但是您必须将其称为常见集合之一- ListSet

所以:

private List matches = new Matches();

为什么?例如,因为Hibernate对您的集合进行代理以启用延迟加载。所以它创建PersistentListPersistentSetPersistentBag,这是List但不是Matches。因此,如果您想向该集合中添加其他方法,那么就可以了。

查看本文以获取更多详细信息。

但是,您有解决方案。不使用继承,使用组合。例如,您可以向您的实体添加一个方法getMatchesCollection()(除了传统的getter之外),该方法类似于:

 public Matches getMatchesCollection() {
    return new Matches(matches);
 }

您的Matches课程看起来像(使用google-collections ‘ ForwardingList):

public class Matches extends ForwardingList {
    private List<Match> matches;
    public Matches(List<Match> matches) { this.matches = matches; }
    public List<Match> delegate() { return matches; }
    // define your additional methods
}

如果您不能使用Google Collections,只需定义ForwardingList自己-调用底层的所有方法List

如果不需要任何其他方法来对该结构进行操作,则不要定义自定义集合。



 类似资料:
  • 我需要通过连接3个不同的表来获取6列。我在entity类的顶部将它们声明为NamedNativequery,并且使用了create named query method form JPA。当我尝试fo获取结果集时,我得到的是数组对象列表,而不是POJO类型的对象列表。为了将结果集映射到外部POJO,我应该定义任何外部映射吗?

  • 主要内容:集合类型,以下是纠正/补充内容:集合(Collection)是一个将多个对象分组为一个单元的java框架。它用于存储,检索和操作汇总数据。 在JPA中,可以使用集合来持久化包装类和String的对象。JPA允许三种对象存储在映射集合中 - 基本类型,实体和嵌入式类型。 集合类型 根据要求,我们可以使用不同类型的集合来持久化对象。如下所示 - List Set Map 包中包含集合框架的所有类和接口。 以下是纠正/补充内容: 根据

  • 主要内容:集合映射实例,程序输出结果集合(Set)是一个包含唯一元素的接口。 这些元素不保留任何顺序。当需要以无序方式检索唯一元素时,可以使用。 完整的项目目录结构如下所示 - 集合映射实例 在这个例子中,我们将一个对象嵌入到一个实体类中,并将其定义为一个集合类型 - 。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,这个类包含员工, 和嵌入对象(员工地址)。注解 表示嵌入对象。 文件:Employee.java 的代码

  • 问题内容: 我正在尝试确定是否有可能让JPA保留具有具体实现的抽象集合。 到目前为止,我的代码如下所示: 但是我一直在绊脚石下面的映射错误,我真的不知道这是否可行? 更新 我不认为问题出在抽象类上,而是 @MappedSuperClass 批注。看起来jpa不喜欢使用 @MappedSuperClass 映射一对多关系。如果我将抽象类更改为具体类,则会遇到相同的错误。 如果我然后更改为 @Enti

  • 问题内容: 我有一个带有四列ID,名称,颜色,形状的食用水果。 该表中的条目为: 现在,我将一个实体类Fruit映射到上表。 在我的DAO类中,代码是: 显而易见,在上面的查询中运行将返回3行。 我有一个简单的TO类FruitSearchTO 此TO符合我的查询返回的行。 但是在我的DAO中运行类似: 抛出异常java.lang.ClassCastException:[Ljava.lang.Obj

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。