OneToOne ConstraintViolation при сохранении новой записи, при условии PK - PullRequest
0 голосов
/ 07 ноября 2018

У нас есть сущность с именем Customers, которая имеет отношение OneToOne к сущности Address.

PK Customer должен быть определен вручную. Address 'PK должен быть определен автоматически.

Итак, в Customer я опустил @GeneratedValue, и я предоставляю значение вручную. Но при попытке сохранить я получаю следующую ошибку:

2018-11-07 10:42:17.810 ERROR 1257 --- [nio-8080-exec-2] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [Validation failed for classes [br.com.customers.entity.Address] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='não pode ser nulo', propertyPath=street, rootBeanClass=class br.com.customers.entity.Address, messageTemplate='{javax.validation.constraints.NotNull.message}'}

Проблема в том, что предоставляется address.street, и я не могу понять, почему JPA жалуется, что он нулевой ...

Вот тело JSON, которое я пытаюсь сохранить. (Это правильно десериализовано, так как Address не равен NULL)

{
    "customer_Id": 50,
    "name": "name",
    "company_name": "company_name",
    "email": "email@provider.com",
    "business_phone": "(00) 1111-2222",
    "mobile_phone": "(00) 1111-2222",
    "document": "123456789",
    "state_registration_number": "ISENTO",
    "state_registration_type": "NO_CONTRIBUTOR",
    "city_registration_number": "ISENTO",
    "classification": "AUTO",
    "address": {
        "street": "STREET NAME",
        "number": "NUMBER",
        "complement": "COMPLEMENT",
        "zip_code": "ZIP_CODE",
        "neighborhood": "NEIGHBORHOOD",
        "city": "CITY",
        "state": "STATE"
    }
}

Вот объект клиента:

@Data
@Entity(name = "X_CUSTOMERS")
public class Customer {

    @Id
    private int customer_Id;

    @NotNull
    private String name;

    private String company_name;

    private String email;

    private String business_phone;

    private String mobile_phone;

    @NotNull
    private String document;

    private String state_registration_number;

    private String state_registration_type;

    private String city_registration_number;

    @NotNull
    private String classification;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "address_id")
    private Address address;

}

А вот, адрес объекта:

@Data
@Entity(name = "X_ADDRESS")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int address_Id;

    @NotNull
    private String street;

    private String number;

    private String complement;

    private String zip_code;

    private String neighborhood;

    private String city;

    private String state;

}

Что я делаю не так? Спасибо !!!


При добавлении кода сохраняются сущности:

Репозиторий клиентов:

public interface CustomerRepository extends JpaRepository<Customer, Integer> {

}

Для сохранения:

@RestController
@RequestMapping("/customers")
public class CustomersController {

    private CustomerRepository customerRepository;

    public CustomersController(CustomerRepository customerRepository) {
        this.customerRepository = customerRepository;
    }

    @PostMapping
    public Customer postCustomer(@RequestBody Customer customer) {
        return customerRepository.save(customer);
    }


}

Ответы [ 2 ]

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

Если вы добавите CascadeType.MERGE, он будет работать

@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "address_id")
    private Address address;

вы устанавливаете идентификатор клиента (50), поэтому будет выполнена следующая строка SimpleJpaRepository.

return this.em.merge(entity); 
0 голосов
/ 07 ноября 2018

После прочтения документации Hibernate в операции сохранения сохраняются только сущности с автоматически генерируемыми идентификаторами. Итак, если вы намереваетесь установить идентификатор самостоятельно, то вам нужно изменить метод вставки на постоянный. А так как у вашего клиента есть идентификатор, который не генерируется автоматически, возможно, это может быть проблемой. Вы можете прочитать больше в этом блоге .

@PostMapping
public Customer postCustomer(@RequestBody Customer customer) {
    return customerRepository.persist(customer);
}

Надеюсь, это поможет.

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