在JPA事务提交Eclipselink之后,Id为null

时间:2013-11-21 09:01:51

标签: java jpa eclipselink entitymanager

用户映射

@Id
@Basic(optional = false)
@SequenceGenerator(name = "sec_t_usuario", allocationSize = 1)
@GeneratedValue(generator = "sec_t_usuario", strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Integer id;

@OneToMany(mappedBy = "idUsuario", cascade = {CascadeType.ALL})
private Set<Session> sessions;

会话映射

@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH  })
@JoinColumn(name = "id_usuario", referencedColumnName = "id", nullable = false)
private User user;

代码链接两个实体

 @Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor=PlayTheGuruException.class)
 private Session createSession(final User user) throws PlayTheGuruException
 {
    final Session session = new Session();

    session.setActive(true);
    session.setLastLogin(Calendar.getInstance());
    session.setUser(user);

    user.addSession(session);

    entityManager.merge(user);

    return session;
}

主要方法

public Message<ResultDTO> registerUser(final Message<NewUserDataDTO> messageIn) throws PlayTheGuruException
{
    .
    .
    .
    final Session session = createSession(messageIn);
    .
    //here the user Id is still null
    .

有了这个上下文,为什么当我从createSession事务方法返回时,用户id仍然为null,知道事务已被提交?

我有来自eclipse链接的查询日志,并告诉我用户已插入并且id也已分配但似乎未在代码中刷新。

我已尝试刷新并从会话中获取对象用户或直接使用。

谢谢!

1 个答案:

答案 0 :(得分:1)

entityManager.merge()(请参阅here)方法返回托管实例。在我看来,作为参数发送的user实例未被附加。换句话说,它不是你所谓的“out”参数,所以你赢了;在该对象中设置了ID。您需要使用返回的对象才能找到生成的ID。

session实例绝对不会被管理。而且它引用的User也不是托管实例。