Spring REST API - Пользователь + его профиль сохраняются - PullRequest
0 голосов
/ 08 декабря 2018

Я сделал отображение POST myapp.com/users в моем приложении Spring.Когда я отправляю данные в это отображение, мне нужно создать 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 голосов
/ 08 декабря 2018

Полагаю, у вас есть атрибут, помеченный @ Id .Вы должны добавить mappedBy к владельцу отношений, в вашем случае Пользователь .Попробуйте следующие модификации

@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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...