2012-03-04 81 views
0

我仍然不是实体状态完全清楚,我已经失败尝试就下列情况几件事情:JPA的新手 - 不坚持每个包含实体时现有成员坚持

@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将被发送(但不包括其他属性,它们在那里没有用处)。 是否有任何自动的方法来告诉实体管理器附加(而不是持久化)持久化新Foo时设置ID的Bar实例?

在此先感谢您的帮助!

罗尔夫

回答

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

getReference()甚至没有进入到数据库:它返回一个代理,以实际的吧。如果它不存在,由于foreigk键引用错误,在刷新时会抛出一个错误。如果你想检查该实体是否存在:

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

好的,所以我必须在每次调用之前手动调用此函数,然后再继续执行Foo实例吗? – Rolf 2012-03-04 09:56:27

+0

是的,就是这样。 – 2012-03-04 09:58:35