当前位置: 首页 > 知识库问答 >
问题:

JPA合并@Column(update=false,insertable=false)不会返回实际的列值

广瑞
2023-03-14

简而言之,我在数据库中有一列是这样设置的:

create table if not exists thing(
    id bigint primary key,
    ...,
    test int default 5
);

这样的实体:

@Entity
public class Thing {

    private long id;
    ...
    private int test;
    ...

    @Id public long getId() { return id; }
    public void setId(long id) { this.id = id; }

    public void setTest(int test) { this.test = test; }

    @Column(updatable = false, insertable = false)
    public int getTest() {
        return test;
    }

当我像这样合并一个新实体时:

Thing thing = new Thing ();
thing.setId(123);
Thing managed = em.merge(thing);

托管不会将testfield与数据库同步。它将显示<code>0</code>。我如何强制所有JPA更新数据库设置的本质上是不可变字段的内容?

其目的是创建日期字段。但还有其他场景,如由触发器设置的DB字段。。。

共有1个答案

朱浩大
2023-03-14

正如Billy Frost提到的-您必须从数据库中刷新实体。

但是在调用refresh之前,您必须强制Hibernate执行SQL语句。

Thing thing = new Thing ();
thing.setId(123);
Thing managed = em.merge(thing);

em.flush(); // executes SQL statements
em.refresh(managed ); // gets the managed thing from the database
 类似资料:
  • 我正在使用 Oracle 数据库,我有序列和触发器用于在插入之前生成和存储 ID。 然后我有一个带有属性的简单实体: ...当我尝试构建项目时,我得到: 当我删除可插入或可更新的关键字时,它可以工作。我知道有很多解决方案如何使用 JPA 生成 ID,JPA 也可以使用(调用)预言机序列来设置(生成)ID。但我试图理解为什么我的解决方案是错误的。为什么我不能将这两个关键字与@Id注释一起使用?我的想

  • 问题内容: 如果对字段进行了注释,这是否意味着您不能插入值或更改现有值?你为什么想这么做? 问题答案: 当创建/更新相关实体的 责任 不在 当前 实体中时,您可以这样做。例如,您有一个和一个。您想添加与实体中实体的关系,只是因为创建或更新并不是实体的责任。相反。

  • 问题内容: 和JPA持久性之间有什么区别? 问题答案: Gordon Yorke(EclipseLink体系结构委员会成员,TopLink核心技术负责人,JPA 2.0专家组成员)在此主题上写了一个很好的答案,因此,我不用表述他,而是引用他的答案: 和 之间的区别是评估它们的范围。’ ‘ 的定义讨论了属性和字段值,并建议应在运行时内评估此功能。“ ”仅指数据库列。 如果实现选择实现,则这些属性应由

  • 问题内容: 在我的程序中,我有一个字符串(从外部库获取),该字符串与任何正则表达式都不匹配。 知道有什么问题吗?当我打印到标准输出时,看起来还可以。 这是从PDF提取文本的代码(我正在使用iText 5.0.1): 问题答案: 默认情况下,不匹配的换行符。所以我的猜测是您包含换行符。 还要注意,它将匹配整个字符串,而不仅仅是字符串的一部分:它不会做什么! 一些例子: 在最后一个例子将导致匹配换行符

  • 问题内容: 我试图从用户连续读取输入,直到用户键入退出为止。我仅通过输入“ quit”进行测试,但console.hasNext()似乎未返回false。实际上,似乎该程序在第7行(hasNext()行)上被阻止。有任何想法吗? 问题答案: 如果将your 声明为,它将询问是否要接收下一个值。然后,该类将等待用户输入内容,然后返回true。 保留文件之类的东西,其中输入大小是固定的。这样,当查询文

  • 问题内容: 我正在创建一个需要实施的游戏。在游戏过程中,我想在特定时间内暂停监听器。我尝试从方法返回false ,但方法仍然保持执行状态。还有其他方法可以让监听器暂停一段时间吗?任何人都请解释一下从错误返回的实际含义是什么? 问题答案: 从View文档中: 如果您返回,则告诉android媒体已经处理完毕。算了吧。 如果您返回,则基本上会说“不是我的问题,请其他人来处理此点击”。然后android