0

我仍然不完全清楚实体状态,并且我在以下情况下尝试了几件事,但均未成功:

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

在此先感谢您的帮助!

罗尔夫

4

1 回答 1

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);
于 2012-03-04T09:54:56.180 回答