我有两个实体,User和Operation,两个实体之间都有一个连接:
@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
}
两个实体也有一个存储库。
在我的上下文中,当用户(操作员)被记录时,用户实体在会话范围(HttpSession)中加载。 对于系统上用户的每个操作,app通过Operation Repository注册该操作。
我的问题是:如何在数据库中的寄存器之前将用户实体(进行会话)设置为操作?
是否可以覆盖Repository方法?
使用HTTP POST方法通过Web界面保存操作。我需要继续使用URI来保存。喜欢:
URI:http:// localhost:9874 / operations DATA:{" name":" operation-name" }
谢谢!
答案 0 :(得分:3)
您可以创建一个预存储事件处理程序,您可以在其中设置关联:然后您可以将标准的Spring Data Rest帖子发送到http://localhost:9874/operations,而不需要自定义存储库或控制器。
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) {
}
}
您说用户存储在会话中。我接受你那么你没有使用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);
}
}
答案 1 :(得分:0)
创建自定义存储库接口并为其编写实现。例如。
public interface OperationRepositoryCustom {
<T extends Operation> T saveCustomized(Operation operation);
}
您的实现类看起来像这样。
public class OperationRepositoryImpl implements OperationRepositoryCustom{
//You can autowire OperationRepository and other dependencies
@Autowired
OperationRepository operationRepository;
@Override
public Operation saveCustomized(Operation operation) {
//put your code to update operation with user and save it by calling operationRepository.save().
}
}
请注意命名约定,即您的自定义实现需要与您的存储库+ Impl具有相同的名称。因此,如果您的存储库接口名为OperationRepository,则您的自定义存储库接口应为OperationRepositoryCustom,impl应命名为OperationRepositoryImpl
希望有所帮助