用户映射
@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也已分配但似乎未在代码中刷新。
我已尝试刷新并从会话中获取对象用户或直接使用。
谢谢!
答案 0 :(得分:1)
entityManager.merge()
(请参阅here)方法返回托管实例。在我看来,作为参数发送的user
实例未被附加。换句话说,它不是你所谓的“out”参数,所以你赢了;在该对象中设置了ID。您需要使用返回的对象才能找到生成的ID。
session
实例绝对不会被管理。而且它引用的User
也不是托管实例。