【问题标题】:Spring Boot, JPA/Hibernate DTO, ManyToOneSpring Boot、JPA/Hibernate DTO、ManyToOne
【发布时间】:2016-03-08 21:09:43
【问题描述】:

这是我第一个使用 Spring/Spring Boot 的项目。这是一个简单的书签服务,包含用户和书签实体。对于每个控制器,在创建/发布时创建并验证 DTO。如果 DTO 有效,我将实例化一个新用户或书签。

我遇到的问题是,当我创建新书签时,书签表中的 user_id 列为空。我将从 DTO 和控制器这两个域对象开始发布代码。

用户

@Entity
public class User {

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

@Column(unique = true, nullable = false)
private String username;
private String password;

@Column(unique = true, nullable = false)
private String email;

@Column(name = "role", nullable = false)
@Enumerated(EnumType.STRING)
private Role role;

@OneToMany(mappedBy = "user")
private List<Bookmark> bookmarks;

public User() { }

public Long getId() {
    return id;
}

//getters and setters and toString.
}

书签

@Entity
public class Bookmark {

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

private String url;

@Column(length = 2048)
private String description;

@ManyToOne()
private User user;

public Bookmark() { }

//getters and setters and toString.
}

用户 DTO

public class UserCreateForm {

@NotEmpty
private String username = "";

@NotEmpty
private String password = "";

@NotEmpty
private String passwordConfirmation = "";

@NotEmpty
@Email
private String email = "";

@NotNull
private Role role = Role.USER;

//getters and setters and toString.
}

书签 DTO

public class BookmarkCreateForm {

@NotEmpty
@URL
private String url="";

private String description="";

private Long userId;

public BookmarkCreateForm() { }

//getters and setters and toString.
}

这里真的只有书签控制器很重要,所以我会跳过用户控制器,但如果需要可以添加它。

书签控制器

@RestController
public class BookmarkController {

private final UserService userService;

private final BookmarkSerivce bookmarkSerivce;

@Autowired
public BookmarkController(UserService userService, BookmarkSerivce bookmarkSerivce) {
    this.userService = userService;
    this.bookmarkSerivce = bookmarkSerivce;
}

@RequestMapping("{userId}/add")
public Bookmark addBookmark(@PathVariable("userId") Long userId, @RequestBody BookmarkCreateForm form) {

    User user = userService.getUserById(userId)
            .orElseThrow(() -> new NoSuchElementException(String.format("User=%s not found", userId)));

    System.out.println(form.getUserId());
    Bookmark bookmark = bookmarkSerivce.create(form);

    return bookmark;
}

}

还有 BookmarkServiceImpl

@Service
public class BookmarkServiceImpl implements BookmarkSerivce {

private final BookmarkRepository bookmarkRepository;

@Autowired
public BookmarkServiceImpl(BookmarkRepository bookmarkRepository) {
    this.bookmarkRepository = bookmarkRepository;
}

@Override
public Bookmark create(BookmarkCreateForm form) {
    Bookmark bookmark = new Bookmark();
    bookmark.setUrl(form.getUrl());
    bookmark.setDescription(form.getDescription());

    return bookmarkRepository.save(bookmark);
}
}

【问题讨论】:

  • 请出示BookmarkService的代码。
  • 对不起,邓尼。已添加。

标签: spring-boot spring-data-jpa dto


【解决方案1】:

我是个白痴。解决方案很简单,在 dunni 要求我发布 BookmarkService 之后我意识到了。

BookmarkCreateForm(DTO)没有 User 属性。所以在 BookmarkService 中,当设置 Bookmark 对象的属性时,用户永远不会被设置。显然 JPA/Hibernate 无法映射不存在的用户。

代码:

public class BookmarkCreateForm {

@NotEmpty
@URL
private String url="";

private String description="";

private User user;

public BookmarkCreateForm() { }

//getters / setters
}

书签服务

@Service
public class BookmarkServiceImpl implements BookmarkSerivce {

private final BookmarkRepository bookmarkRepository;

@Autowired
public BookmarkServiceImpl(BookmarkRepository bookmarkRepository) {
    this.bookmarkRepository = bookmarkRepository;
}

@Override
public Bookmark create(BookmarkCreateForm form) {
    Bookmark bookmark = new Bookmark();
    bookmark.setUrl(form.getUrl());
    bookmark.setDescription(form.getDescription());
    bookmark.setUser(form.getUser());

    return bookmarkRepository.save(bookmark);
}

}

书签控制器

@RestController
public class BookmarkController {

private final UserService userService;

private final BookmarkSerivce bookmarkSerivce;

@Autowired
public BookmarkController(UserService userService, BookmarkSerivce bookmarkSerivce) {
    this.userService = userService;
    this.bookmarkSerivce = bookmarkSerivce;
}

@RequestMapping("{userId}/add")
public Bookmark addBookmark(@PathVariable("userId") Long userId, @RequestBody BookmarkCreateForm form) {

    User user = userService.getUserById(userId)
            .orElseThrow(() -> new NoSuchElementException(String.format("User=%s not found", userId)));

    form.setUser(user);
    Bookmark bookmark = bookmarkSerivce.create(form);

    return bookmark;
}

}

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2020-02-04
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多