休眠 @OneToOne 与 Principal REST 的映射

Posted

技术标签:

【中文标题】休眠 @OneToOne 与 Principal REST 的映射【英文标题】:hibernate @OneToOne mapping with Principal REST 【发布时间】:2017-11-13 01:29:16 【问题描述】:

解决方案:我解决了,这是新的 RestUser.java,如果它将来可以帮助任何人

@RequestMapping(value="/rate", method=RequestMethod.POST)
public ResponseEntity rate(@RequestBody Rating rating, Principal principal)

    User user = userService.findByUsername(principal.getName());
    Rating ratingAVG = ratingService.findOne(user.getId());
    ratingAVG.setFood(rating.getFood());
    ratingAVG.setService(rating.getService());
    user.setRating(ratingAVG);
    ratingAVG.setUser(user);
    userService.save(user);

    return new ResponseEntity("Rated!", HttpStatus.OK);

问题

我在插入/更新具有外键的对象时遇到问题。我有一个名为 Rating 的表,看起来像这样。我想添加一个唯一的 Rating 对象,它使用principal.getName() 获取当前 user_id。我正在使用 Advanced REST 客户端对其进行测试,并且已经登录

+------------------------------------------------+
|                     Rating                     |
+------------------------------------------------+
| id |    food     |    service     |   user_id  |
+----+-------------+----------------+------------+
|  1 |     5       |        5       |      1     |
+----+-------------+----------------+------------+

用户.java

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="Id", nullable=false, updatable=false)
private long id;

private String username;
private String password;
private String firstName;
private String lastName;

@OneToOne(cascade=CascadeType.ALL, mappedBy="user")
@JoinColumn(name="user_id", unique=true)
private Rating rating;

Rating.java

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

private int food;
private int service;

@OneToOne(cascade = CascadeType.ALL)
@JsonIgnore
private User user;

RatingServiceimpl.java

@Service
public class RatingServiceImpl implements RatingService 

    @Autowired
    private RatingRepository ratingRepository;

    @Override
    public Rating save(Rating rating) 
        return ratingRepository.save(rating);
    


UserRest.java

@RestController
@RequestMapping("/user")
public class UserRest 

    @Autowired
    UserService userService;

    @Autowired
    RatingService ratingService;


    @RequestMapping(value="/rate", method=RequestMethod.POST)
    public ResponseEntity rate(@RequestBody Rating rating, Principal principal)

        User user = userService.findByUsername(principal.getName());
        user.setRating(rating);
        rating.setUser(user);
        userService.save(user);

        return new ResponseEntity("Rated!", HttpStatus.OK);
    


这就是我得到的,它添加了一个新对象,而我只是希望它更新现有的对象。

mysql Browser Screen

谢谢!

【问题讨论】:

【参考方案1】:

您似乎正在通过我们设置用户来保存评分。我没有看到任何“@Transaction”注释,因此我假设您的交易在“RatingRepository”内,这意味着您的交易将在您为用户设置评级之前提交。

在调用 save 之前尝试将用户设置为评级。

【讨论】:

谢谢!现在它添加了一个新对象,该对象采用 user_id 但仍不替换现有对象。任何想法 ?我更新了 UserRest.java 和图像。

以上是关于休眠 @OneToOne 与 Principal REST 的映射的主要内容,如果未能解决你的问题,请参考以下文章

使用公式休眠@OneToOne - 列不能外连接到子查询

hibernate/jpa double OneToOne 与一个实体的双向关系

如何确保休眠 5 在与共享主键的一对一关系中保持正确的顺序

休眠中的异常(一对一)

Spring - 使用休眠和弹簧安全扩展类

一对多和一对多连续映射的休眠条件查询 - 表或视图不存在