Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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/Hibernate尝试从(只读)DB view mapped Map属性中删除?_Java_Hibernate_Jpa_Jpa 2.1_Hibernate 5.x - Fatal编程技术网

Java 如何防止JPA/Hibernate尝试从(只读)DB view mapped Map属性中删除?

Java 如何防止JPA/Hibernate尝试从(只读)DB view mapped Map属性中删除?,java,hibernate,jpa,jpa-2.1,hibernate-5.x,Java,Hibernate,Jpa,Jpa 2.1,Hibernate 5.x,我有这样的想法: @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "my_read_only_view", joinColumns = {@JoinColumn(name = "entity_id", referencedColumnName = "id", updatable = false, insertable =

我有这样的想法:

    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "my_read_only_view",
        joinColumns = {@JoinColumn(name = "entity_id", referencedColumnName = "id", updatable = false, insertable = false)})
    @MapKeyColumn(name = "key", updatable = false, insertable = false)
    @Column(name = "value", updatable = false, insertable = false)
    private Map<Long, MyEnum> mapProperty;
@ElementCollection(fetch=FetchType.LAZY)
@CollectionTable(name=“我的只读视图”,
joinColumns={@JoinColumn(name=“entity_id”,referencedColumnName=“id”,updateable=false,insertable=false)})
@MapKeyColumn(name=“key”,updateable=false,insertable=false)
@列(name=“value”,updateable=false,insertable=false)
私有地图财产;
正如它的名字所说,my_read_only_view是一个只读数据库视图,它使用特定于DB的SQL自动“计算”键和值(在JPA/Hibernate scope或QLs中我无法做到这一点)。然而,当“所有者”实体被删除时,Hibernate会尝试做它认为是自己职责的事情。。。并从该只读视图中删除相关行。DB随后会以
无法从视图中删除
错误进行响应

其他详细信息(我无法更改):

  • 冬眠5.4.14
  • 使用字段访问+字节码增强:
    enableLazyInitialization=true
    enableDirtyTracking=true
    enableAssociationManagement=false
    enableExtendedEnhancement=false
    。。。和
    hibernate.bytecode.use\u reflection\u optimizer=true
  • 该字段实际上仅由getter使用。事实上,甚至没有使用getter。这个映射的存在只是为了让我们可以将它包含在搜索条件中,甚至不应该被提取

  • 我通过创建一个DB规则来忽略删除尝试来处理错误。。。但这仍然会对性能产生一些影响。阻止Hibernate尝试删除此项的最佳方法是什么?我在看
    @Formula
    ,但这是一个映射,据说Hibernate将在每次提取时执行它,这绝对不是我们需要或想要的。

    您好!你能改变地图吗?如果它是一个key=yourEntityId的映射,这不意味着可以直接映射它的值吗?让一个不可变的实体“MapEntry”包含实体的当前键和映射的当前值,而不是完整映射,怎么样?我可以调整映射。不过,事情并没有那么简单。实际上,它是一个“假装”每个实体(id)和用户(id)组合都有一行的视图,还有一列显示用户对该实体的访问/权限。这在访问控制方面提供了一致性。正如我所说,它从未被提取,但它参与了搜索条件(用户必须有足够的权限访问实体)。您是否尝试过
    @Immutable
    ?嗯,不。现在尝试。第二天早上我会有结果。。。。或者更早。。。will-seeDidn't help:
    [org.hibernate.engine.jdbc.spi.SqlExceptionHelper]错误:无法从视图中删除…