Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA EclispeLink Insert/Persist将空列表替换为空列表_Java_Jpa_Persistence_Eclipselink - Fatal编程技术网

Java JPA EclispeLink Insert/Persist将空列表替换为空列表

Java JPA EclispeLink Insert/Persist将空列表替换为空列表,java,jpa,persistence,eclipselink,Java,Jpa,Persistence,Eclipselink,我有两个实体Person和PersonImage: @Entity public class Person { .... @OneToMany(mappedBy = "person", cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, orphanRemoval = true, fetch = FetchType.LAZY) private List<PersonImage> im

我有两个实体
Person
PersonImage

@Entity
public class Person {

....

    @OneToMany(mappedBy = "person", cascade = { CascadeType.PERSIST,
            CascadeType.REMOVE }, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<PersonImage> images;

....
}

@Entity
public class PersonImage {

....

    @Lob
    private byte[] content;

    @ManyToOne
    private Person person;
....

}
@实体
公共阶层人士{
....
@OneToMany(mappedBy=“person”,cascade={CascadeType.PERSIST,
CascadeType.REMOVE},orphanRemoving=true,fetch=FetchType.LAZY)
私有列表图像;
....
}
@实体
公共类人物形象{
....
@高球
私有字节[]内容;
@许多酮
私人;
....
}
问题是,当我插入一个
(没有附加任何图像)时,在插入之前
图像
列表为
。但是在插入之后,列表是一个空的
间接列表
实例。调试时我可以看到它从
null
更改为
{[]}


为什么会这样?我希望它是null或未初始化的
间接列表
(在调试时应类似于
{IndirectList:notinstantized}
)。如何实现这一点?

猜测您会看到org.eclipse.persistence.indirection.IndirectList实例,它在内部用于表示这种1:N关系。 它在内部保存向量委托实例,当调用persist时,间接列表和向量都被实例化。这是默认的日食行为


空值和emty列表在1:N关系中的语义是相同的:没有与Person关联的PersonImage实例。您是否有认真的理由区分空列表和空列表?如果是这样,则必须将其保存在单独的属性中

为了让JPA实现保留集合是空还是空的知识,它必须在表中有一列来存储该信息。我怀疑EclipseLink是否支持这一点,所以大概只是实例化了一个空的list@NeilStocktonAFAIK JPA实现应该假设任何惰性集合都未初始化,并且在访问时它将对引用的表进行查询。因此,我假设列表一开始是空的,但同时也被标记为未初始化的——或者我弄错了吗?你指的是Hibernate是如何做到这一点的,作为一项规则,假设这一点是不正确的。其他实现默认使用字节码增强,因此没有未初始化的代理。默认情况下,EclipseLink是如何工作的?我不知道。@NeilStockton嗯,我主要使用Hibernate,但我并没有假设它在EclipseLink中的工作方式是相同的。仅从逻辑的角度来看,不知道惰性集合是否有任何元素的JPA实现应该有一些方法来检测(我很确定这是JPA规范的一部分)-事实上,EclipseLink似乎有一些相似之处,因为调试器显示不同的字符串表示。知道它是否有一些元素不是问题所在。好的,所以它没有元素。这并不是说它是空的还是一个空的列表。。。回到我的第一个评论。