【问题标题】:JPA newbie - do not persist existing member each time containing entity is persistedJPA新手 - 每次保留包含实体时不要保留现有成员
【发布时间】:2012-03-04 09:48:16
【问题描述】:

我对实体状态仍然不完全清楚,我尝试了以下几种情况,但均未成功:

@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 时设置?

提前感谢您的帮助!

罗尔夫

【问题讨论】:

    标签: java jpa persist


    【解决方案1】:
    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);
    

    【讨论】:

    • 好的,所以我每次在 Foo 实例上调用 persist 之前都必须手动调用它?
    猜你喜欢
    • 2015-05-25
    • 2017-06-05
    • 1970-01-01
    • 2011-09-19
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多