JPA OneToOne, внешний ключ обнуляется при загрузке Spring - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть отношения @OneToOne JPA.Сохраняемые значения берутся из формы JSP.Я отладил свои коды:

id = 0
firstName = "john"
firstName = "doe"
security =
   id = 0
   username = "john1"
   password = "pwd"
   employee = null

Вот мои сущности:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @NotBlank(message = "First Name is a required field.")
    private String firstName;
    @NotBlank(message = "Last Name is a required field.")
    private String lastName;
    @Valid
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "employee", optional = false)
    private Security security;
...
}

@Entity
public class Security {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @NotBlank(message = "Username is a required field.")
    private String username;
    @NotBlank(message = "Password is a required field.")
    private String password;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "employee_id", nullable = false)
    private Employee employee;
...
}

Я не понимаю, почему employee_id становится нулевым:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'employee_id' cannot be null

Я реализуюCommandLineRunner со следующими кодами, и он работает:

Employee employee = new Employee();
employee.setFirstName("Julez");
employee.setLastName("Jupiter");

Security security = new Security();
security.setUsername("julez");
security.setPassword("pwd");

employee.setSecurity(security);
security.setEmployee(employee);

employeeRepository.save(employee);

Как Spring Boot / MVC или Spring Data JPA автоматически достигают аналога моего CommnadLineRunner кода?Я искал много учебных пособий и вопросов здесь, в SO, но я мог найти только использование CommandLineRunner и не использование формы.Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Убедитесь, что вы установили значение OneToOne объекта, если OneToOne является частью двунаправленного отношения OneToOne, убедитесь, что вы установили OneToOne в обоих объектах, JPA не поддерживает двунаправленные отношения для вас.

вики-книги

Например, вы можете определить ведущую сущность, которая устанавливает обе стороны:

@Entity
public class Security {
    public void setEmployee(Employee employee) {
        this.employee = employee;
        this.employee.setSecurity(this);    
    }
}
0 голосов
/ 13 ноября 2018

Сохранить Employee, затем сохранить Security

Employee employee = new Employee();
employee.setFirstName("Julez");
employee.setLastName("Jupiter");

employee = employeeRepository.save(employee);

Security security = new Security();
security.setUsername("julez");
security.setPassword("pwd");

security.setEmployee(employee);
securityRepository.save(security);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...