【问题标题】:Id null after JPA transaction commit EclipselinkJPA 事务提交后 Id null Eclipselink
【发布时间】:2013-11-21 09:01:51
【问题描述】:

用户映射

@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 仍然为空?

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

我尝试过从会话或直接刷新并获取对象用户但不起作用。

谢谢!

【问题讨论】:

  • 你能把repository.saveUser()方法的内容贴出来好吗? user 实例可能已分离。
  • 这是一个使用实体管理器的简单“合并”。

标签: java jpa eclipselink entitymanager


【解决方案1】:

entityManager.merge()(参见here)方法返回一个托管实例。在我看来,作为参数发送的 user 实例没有被附加。换句话说,这不是您所说的“out”参数,因此您不会在该对象中设置 ID。您需要使用返回的对象才能找到生成的 ID。

session 实例绝对不受管理。而且它引用的@​​987654325@ 不是托管实例。

【讨论】:

  • 好的。我会尝试你的方法并告诉你消息。谢谢!
  • 完美运行。我不会再忘记这个概念了 XD 谢谢!
猜你喜欢
  • 2017-04-11
  • 2015-12-17
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多