Spring REST API-用户及其个人资料保持不变

时间:2018-12-08 17:01:32

标签: java spring rest

我在Spring App中进行了POST映射myapp.com/users。将数据发送到此映射时,需要创建User和他的Profile。它们之间的关系是OneToOne。示例:

AbstractEntity:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
}

用户:(仅重要的内容)

@Entity
@Table(name = "Users")
public class User extends AbstractEntity {

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

    @Basic(optional = false)
    @Column(nullable = false)
    private String password;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
    private Profile profile;

    public Profile getProfile() {
        return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

个人资料:(仅重要内容)

@Entity
@Table(name = "Profiles")
public class Profile extends AbstractEntity {

    @Basic(optional = false)
    @Column(nullable = false)
    private String name;

    @Basic(optional = false)
    @Column(nullable = false)
    private String surname;

    @OneToOne
    @JoinColumn(name = "USER_ID")
    private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

还有我的RestController:

@RestController
@RequestMapping("/users")
public class UserController {

    private static final Logger LOG = LoggerFactory.getLogger(UserController.class);

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * Registers a new user.
     *
     * @param user User data
     */
    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Void> register(@RequestBody User user) {
        try {
            userService.persist(user);
            LOG.debug("User {} successfully registered.", user);
            final HttpHeaders headers = RestUtils.createLocationHeaderFromCurrentUri("/current");
            return new ResponseEntity<>(headers, HttpStatus.CREATED);
        }
        catch (TransactionSystemException e) {
            throw new PersistenceException(e.getOriginalException());
        }
    }
}

如何发送用户和个人资料? @RequestBody只能接收我所知道的一个实体。我尝试了以下JSON数据:

{
    "username": "admin",
    "password": "1234",
    "profile":{
        "name": "User",
        "surname": "Test"
    }
}

但是即使创建了用户和个人资料,它们之间也没有关系(未设置USER_ID)。

这是表的定义:

CREATE TABLE `profiles` (
  `ID` int(11) NOT NULL,
  `BIRTHDATE` date DEFAULT NULL,
  `DESCRIPTION` varchar(255) DEFAULT NULL,
  `GENDER` varchar(255) DEFAULT NULL,
  `IMAGE` varchar(255) DEFAULT NULL,
  `NAME` varchar(255) NOT NULL,
  `SURNAME` varchar(255) NOT NULL,
  `USER_ID` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `sequence` (
  `SEQ_NAME` varchar(50) NOT NULL,
  `SEQ_COUNT` decimal(38,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `sequence` (`SEQ_NAME`, `SEQ_COUNT`) VALUES
('SEQ_GEN', '50');

CREATE TABLE `users` (
  `ID` int(11) NOT NULL,
  `BLOCKED` tinyint(1) NOT NULL DEFAULT 0,
  `EMAIL` varchar(255) NOT NULL,
  `PASSWORD` varchar(255) NOT NULL,
  `ROLE` varchar(255) DEFAULT NULL,
  `USERNAME` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `profiles`
  ADD PRIMARY KEY (`ID`),
  ADD KEY `FK_profiles_USER_ID` (`USER_ID`);

ALTER TABLE `sequence`
  ADD PRIMARY KEY (`SEQ_NAME`);

ALTER TABLE `users`
  ADD PRIMARY KEY (`ID`),
  ADD UNIQUE KEY `EMAIL` (`EMAIL`),
  ADD UNIQUE KEY `USERNAME` (`USERNAME`);

ALTER TABLE `profiles`
  ADD CONSTRAINT `FK_profiles_USER_ID` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`);

1 个答案:

答案 0 :(得分:2)

我假设您具有一个用 @Id 注释的属性。 您必须将mapedBy添加到关系的所有者(在您的情况下为 User )。尝试以下修改

@Entity
@Table(name = "Users")
public class User extends AbstractEntity {

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

    @Basic(optional = false)
    @Column(nullable = false)
    private String password;

    //Edited here
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
    private Profile profile;

    public Profile getProfile() {
        return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

@Entity
@Table(name = "Profiles")
public class Profile extends AbstractEntity {

    @Basic(optional = false)
    @Column(nullable = false)
    private String name;

    @Basic(optional = false)
    @Column(nullable = false)
    private String surname;

    //Edited here
    @OneToOne
    @JoinColumn
    private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}