java - JPA 新手 - 每次保存包含实体时不要保存现有成员

标签 java jpa persist

我仍然不完全清楚实体状态,并且我针对以下情况尝试了一些方法但没有成功:

@Entity
public class Foo {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;
    /* other fields */
    @NotNull
    @ManyToOne
    @JoinColumn(name = "related_bar", nullable = false)
    private Bar bar;
    /* getters & setters */
}

@Entity
public class Bar {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;
    /* other fields & methods*/
}

通常,当从 Foo 创建表单发送数据时,将发送相关栏的 ID(但不会发送其其他属性,它们在那里没有任何用处)。 是否有任何自动方法告诉实体管理器附加(而不是持久化)一个 Bar 实例,其 ID 在持久化新的 Foo 时设置?

预先感谢您的帮助!

罗尔夫

最佳答案

Bar bar = em.getReference(Bar.class, barId);
foo.setBar(bar);

getReference() 甚至不访问数据库:它返回实际 Bar 的代理。如果不存在,则由于foreigk键引用错误,将在刷新时抛出错误。如果您想检查实体是否存在:

Bar bar = em.find(Bar.class, barId);
if (bar == null) {
    throw someException();
}
foo.setBar(bar);

关于java - JPA 新手 - 每次保存包含实体时不要保存现有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553876/

相关文章:

Java 扫描器 "rewind"

java - 想要使用实体修改 Hibernate 条件

java - 从外部 Jar 文件加载 JPA 实体

spring - 在事务函数中,调用clear() 分离所有实体?

php - 如何使用 symfony 获取 Doctrine 实体持久集合数据值

Java构造函数和初始化类变量

java - 生成的查询包含架构和目录名称

java - 部署基本的java应用程序以进行分发

java - eclipselink JPA : combining @MappedSuperclass with @Cacheable

Java-Jpa-Hibernate 传递分离实体以在合并时保留