我有两个实体,用户和操作,并且两个实体之间都有一个联接:
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
@Basic
private String username;
private String password;
//Getters and Setters
}
@Entity
public class Operation implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
@ManyToOne
@JoinColumn(name = "user_id")
User user;
//Getters and Setters
}
两个实体也都有一个存储库。
在我的上下文中,当用户(运算符(operator))被记录时,用户实体被加载到 session 范围(HttpSession)中。 对于系统上用户的每个操作,应用程序都会通过操作存储库注册该操作。
我的问题是:如何在数据库注册之前将用户实体(进入 session )设置为操作?
是否可以重写存储库方法?
编辑1:
使用 HTTP POST 方法通过 Web 界面保存操作。我需要继续使用 URI 来保存。喜欢:
URI:http://localhost:9874/操作 数据:{“名称”:“操作名称”}
谢谢!
最佳答案
您可以创建一个预保存事件处理程序,在其中设置关联:然后您可以将标准 Spring Data Rest 发布到 http://localhost:9874/operations并且不需要自定义存储库或 Controller 。
http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_writing_an_annotated_handler
@RepositoryEventHandler
public class OperationEventHandler {
@HandleBeforeSave
public void handleOperationSave(Operation operation) {
}
}
你说用户存储在 session 中。我想你没有使用 Spring Security 吗?如果是,那么您可以使用静态调用获取当前用户:
SecurityContextHolder.getContext().getAuthentication();
否则,您需要尝试将 HttpServletRequest 连接到您的事件处理程序,或使用静态包装器调用,如这些问题的答案中所述:
Spring: how do I inject an HttpServletRequest into a request-scoped bean?
从中你可以获得HttpSession。
下面显示了在这种情况下 HttpServletRequest 中的接线
Spring Data Rest - How to receive Headers in @RepositoryEventHandler
所以你的处理程序看起来像这样:
@RepositoryEventHandler
public class OperationEventHandler {
@Autowired
private HttPServletRequest request;
@HandleBeforeSave
public void handleOperationSave(Operation operation) {
User user = (User)request.getSession().getAttribute("userKey");
operation.setUser(user);
}
}
关于java - 使用 POST 方法在保存之前连接实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43613373/