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

JPA辅助表为只读视图-Hibernate仍尝试插入行

水瀚漠
2023-03-14
问题内容

我有以下实体:

@Entity
@Table(name = "ONE")
@SecondaryTable(name = "VIEW_TWO", pkJoinColumns = @PrimaryKeyJoinColumn(name="ONE_ID"))
public class CpBracket {

@Id
private Long id;

@Column(name="progress", table="VIEW_TWO", updatable = false, insertable = false)
private int progress = 0;

(...)
}

如您所见,该实体使用表 ONE 和(只读)视图 VIEW_TWO 。当我保留实体时,hibernate正在执行插入视图:

insert into VIEW_TWO (ONE_ID) values (?)

它忽略了不可更新和不可插入的列 进度 (这很好),并且仍在尝试插入 ONE_ID
列的值。据我所知,注解@PrimaryKeyJoinColumn将选定的列标记为 insertable = false 和updatable =
false

如何防止hibernate将行插入到辅助表(视图)中?


问题答案:

据我所知,注释将@PrimaryKeyJoinColumn选定的列标记为insertable = false和updatable = false。

我认为情况并非如此:@SecondaryTable当记录是实际表而不是视图时,如何将记录插入到中?

由于没有@SecondaryTable@PrimarykeyJoinColumn有防止插入的一种手段那么这样看来,原来的解决方案是行不通的,而且需要进行选择。

一种选择是将VIEW_TWO映射为,@Entity并以级联选项设置为none CPBracket@OneToOne关系链接到您的课程。

@Entity
@Table(name ="VIEW_TWO")
private CpBracketSummaryData(){

}


@Entity
@Table(name = "ONE")
public class CpBracket {

    @OneToOne
    @PrimaryKeyJoinColumn
    private CPBracketSummaryData summaryData;

    public int getSomeValue(){
        return summaryData.getSomeValue();
    }
}

第二种选择是使用非JPA兼容的,特定于Hibernate的@Formula注释。

@Entity
@Table(name = "ONE")
public class CpBracket {

       @Formula("native sql query")
       private int someValue;
}

2016年10月更新

我在Hibernate 4.3.10.Final和5.1.0.Final中都对此进行了重新讨论,并且可以将视图作为a
@SecondaryTable而无需插入: 如果您具有正确的映射

场景1

加载实体以进行编辑,并且不要触摸映射到辅助表的任何字段。没有更新发布到辅助表

方案2

创建并保存一个新实体,并且不要设置任何映射到辅助表的字段。没有为辅助表发出插入

情况3

创建或更新实体,该实体包括映射到辅助表的字段,并且该字段被标记为insertable = false和updateable = false。的插入
到二次表仅取得了ID字段-the行为报道,在原来的问题。

原始问题中的映射问题在于,辅助表字段是原始类型,因此在保存新实体时,Hibernate确实认为必须将记录写入值为零的辅助表。

@Column(name="progress", table="VIEW_TWO", updatable = false, insertable = false)
private int progress = 0;

然后,解决方案是将原语替换为相应的包装器类型,并将其保留为null。然后,在保存新记录时,没有任何内容可写入辅助表,并且不会进行插入:

@Column(name="progress", table="VIEW_TWO")
private Integer progress;


 类似资料:
  • 我刚开始学习如何使用Guice,我在尝试配置辅助注射时遇到了一些问题。我有以下界面: 它将由工厂制造。构造函数必须接收一个长列表: 实现类有一个@辅助参数来接收列表: 最后,这是我的模块类: 问题是,当我运行项目时会显示此错误: 如果我只是删除辅助参数(不仅是注释,还有参数本身),一切正常。我不知道我做错了什么。我遵循了我找到的所有 Guice 教程,但找不到使用 List 的辅助参数示例

  • 学生课程 我有一个名为v_student_course的Student_Course视图,它包含student_id、course_id和主题(从课程表中检索)。 V_student_course 我必须通过显示一个学生被分配到什么课程来表示学生和课程之间的多对多关系。但是,所有选择必须使用v_student_course视图来完成,所有插入/更新必须使用student_course表来完成。 >

  • 我有一个关于电影和演员的数据库。我想做的是:我想从相应的数组列表中获取演员数据(如姓名、国家、出生日期),并将这些数据插入到我的演员表中。我想对我的电影桌做同样的事情。以下是我的部分代码: 然后我得到这些错误: > < li> 线程“main”javax . persistence . roll back异常:提交事务时出错 -原因:javax.persistence。PersistenceExc

  • 当我进行插入时,在traduction(idMot references mot)中的外键为null,在前面发送正确的外键。我最终出现了这个错误:not-null属性引用了一个空值或临时值:com.virtual.expertise.mydico.model.traduction.mot 我想我在我的模型中做错了什么,但仍然不知道是什么。 下面是交易表: 下面是我的WebService:(其中id

  • 所以我有下面这样的课程,试图实现多人关系 现有表: 以下是serviceClass: 但是当我运行我的代码时,它试图多次插入,因为我遇到了约束冲突,我应该怎么做才能解决这个问题?

  • 我正在做一个在集群环境中运行的项目,那里有许多节点和一个数据库。该项目使用Spring-data-JPA(1.9.0)和Hibernate(5.0.1)。我有问题解决如何防止重复行问题。 举个例子,这里有一个简单的表 重要的部分是有一个约束。 当然,匹配示例存储库: 本例的思想是,系统的某些部分可以插入行,以便为周期性运行的内容进行调度,在所述运行之间可以进行任意次数的调度。当某个东西实际运行时,