Назначьте значения в отношении один к одному - PullRequest
1 голос
/ 01 октября 2019

Я создал сущность «компьютер» и сущность «пользователь» в Rapidclipse (используя Vaadin и JPA / Hibernate). Эти два объекта связаны через отношение один к одному.

Компьютер объекта

@Entity
@DAO(daoClass = ComputerDAO.class)
@Cacheable(true)
@Table(name = "computer")
public class Computer implements Serializable {
    private int id;
    ...
    private User user;
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public int getId() {
        return this.id;
    }
    public void setId(final int id) {
        this.id = id;
    }
    ...
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    public User getUser() {
        return this.user;
    }
    public void setUser(final User user) {
        this.user = user;
    }
    ...
}

Пользователь объекта

@Entity
@DAO(daoClass = UserDAO.class)
@Cacheable(true)
@Table(name = "user")
public class User implements Serializable {
    private int id;
    ...
    private Computer computer;
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public int getId() {
        return this.id;
    }
    public void setId(final int id) {
        this.id = id;
    }
    ...
    @OneToOne(mappedBy = "sps") 
    public Computer getComputer() {
        return this.computer;
    }
    public void setComputer(final Computer computer) {
        this.computer = computer;
    }
    ...
}

Я уже создал несколько компьютеров в моей базе данных. Через группу полей я пытаюсь назначить определенного пользователя определенному компьютеру. Поэтому у меня есть текстовые поля для ввода пользовательских данных для создания нового пользователя и список выбора, чтобы выбрать связанный компьютер. С помощью кнопки сохранения я хочу создать нового пользователя с выбранным подключением к компьютеру.

...
this.fieldGroup.setItemDataSource(new User());
...
private void cmdSave_buttonClick(final Button.ClickEvent event){
    this.fieldGroup.save(); // the user gets created, but there is no link to the computer
    this.listSelect.getSelectedItem().getBean().setUser(this.fieldGroup.getItemDataSource().getBean()); // i am trying to link them manually, but it does not work
}

Как описано, проблема заключается в том, что связь между компьютером и пользователем не записывается в базу данных. В настольном компьютере атрибут user_id всегда равен нулю. Так почему же не получается установить пользователя вручную?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Попробуйте отредактировать @OneToOne(fetch = FetchType.EAGER) аннотацию, которая выглядит следующим образом:

@OneToOne(fetch = FetchType.EAGER, , cascade = CascadeType.ALL)

CascadeType указывает, какие операции распространяются на связанные объекты. он будет гарантировать, что объект, к которому он относится, также будет сохранен в базе данных.

0 голосов
/ 01 октября 2019
  • Пользователь user = новый пользователь (...);
  • Компьютерный компьютер = новый компьютер (...);
  • user.setComputer (компьютер);
  • computer.setUser (пользователь);
  • userDao.save (пользователь);

Это сохранит как пользовательские, так и компьютерные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...