简体   繁体   English

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

[英]Spring REST API - User + his profile persist

I made an POST mapping myapp.com/users in my Spring App. 我在Spring App中进行了POST映射myapp.com/users When I send data to this mapping, I need create User and his Profile . 将数据发送到此映射时,需要创建User和他的Profile Relation between them is OneToOne . 它们之间的关系是OneToOne Example: 例:

AbstractEntity: AbstractEntity:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
}

User: (Only important stuff) 用户:(仅重要内容)

@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;
    }
}

Profile: (Only important stuff) 简介:(仅重要内容)

@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;
    }
}

And my RestController: 还有我的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());
        }
    }
}

How can I send both User and Profile? 如何发送用户和个人资料? @RequestBody can receive only one Entity what I know. @RequestBody只能接收我所知道的一个实体。 I tried this JSON data: 我尝试了以下JSON数据:

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

But even User and Profile are created, there is no relation between them (USER_ID not set). 但是,即使创建了用户和配置文件,它们之间也没有关系(未设置USER_ID)。

Here are the table definitions: 这是表定义:

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`);

I assume you have an attribute annotated with @Id . 我假设您有一个用@Id注释的属性。 You have to add the mappedBy to the owner of the relationship, in your case User . 您必须将mappingBy添加到关系的所有者,在这种情况下为User Try the following modifications 尝试以下修改

@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;
    }
}

And

@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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM