Hibernate не генерирует идентификатор с помощью SequenceGenerator - PullRequest
0 голосов
/ 23 октября 2019

У меня есть простое приложение Spring, использующее базы данных Hibernate и Oracle. Он имеет два объекта (City и Address), связанных друг с другом посредством внешнего ключа (у объекта Address есть city_id). Когда я пытаюсь создать или обновить новую сущность City, все в порядке, но когда я пытаюсь создать новую сущность Address, у меня появляется ошибка:

ORA-01400: cannot insert NULL into ("SCHEME"."ADDRESS"."ID")

Вот запрос Hibernate из журналов:

SQL: insert into address (is_actual, address, create_date, last_modification_date, city_id) values (?, ?, ?, ?, ?)

Очевидно, не генерирует идентификатор новой сущности адреса и даже не добавляет его в запросе . И я не понимаю, почему это происходит.

Вот часть моего класса City:

@Entity
@Table(name = "city")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@NamedQuery(name = "findById", query = "select distinct c from City c where c.id = :id")
public class City {
    private Long id;
    private String name;
    private Date createDate;
    private Date lastModificationDate;
    private Boolean isActual;

    private Address address;

    @Id
    @Column(name = "id", updatable = false, insertable = true)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_seq")
    @SequenceGenerator(name = "id_seq", sequenceName = "SEQ_CITY", allocationSize = 1)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @OneToOne(mappedBy = "city", fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
    @JsonBackReference
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
.......

Вот часть моего класса Address

Entity
@Table(name = "address")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Address {
    private Long id;
    private City city;
    private String address;
    private Date createDate;
    private Date lastModificationDate;
    private Boolean isActual;

    @Id
    @Column(name = "id", updatable = false, insertable = true)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_s")
    @SequenceGenerator(name = "id_s", sequenceName = "SEQ_ADDR")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @OneToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
    @MapsId
    @JsonManagedReference
    public City getCity() {
        return city;
    }

    public void setCity(City city) {
        this.city = city;
    }
.......

У меня есть последовательность SEQ_ADDR в моей базе данных:

CREATE SEQUENCE SEQ_ADDR
START WITH 1
INCREMENT BY 1
NOMAXVALUE;

Вот мой сервис для создания адресов:

@Transactional(propagation = Propagation.REQUIRED)
public void addNewAddress() {
    try {
        SelectBox selectBox = getComponent("addNewAddressBox", CollapsibleBox.class).getComponent("citiesSelectBox", SelectBox.class);
        Long cityId = Long.parseLong(selectBox.getSelectedItems().get(0).getId());
        String addressStr = getComponent("addNewAddressBox", CollapsibleBox.class).getComponent("newAddressInput", TextInput.class).getText();
        Date today = new Date();

        City city = cityDAO.findById(cityId);

        Address address = new Address();

        address.setAddress(addressStr);
        address.setCity(city);
        address.setCreateDate(today);
        address.setActual(true);
        addressDAO.save(address);
    } catch(Exception e) {
        logger.error("ERROR: CAN'T ADD NEW ADDRESS: " + e.getMessage(), e);
    }
}

А вот мой метод SAVE:

public Address save(Address address) {
        Session currentSession = sessionFactory.getCurrentSession();
        currentSession.persist(address);
        return address;
    }

Вот часть файла журнала:

2019-10-23 08:44:35,182 INFO  [stdout] (transport-[8H32M51S31763]-[test-azimuth-app]-[rejecting]-request-processing-[test-app]-thread-11) Hibernate: insert into address (is_actual, address, create_date, last_modification_date, city_id) values (?, ?, ?, ?, ?)
2019-10-23 08:44:35,185 INFO  [stdout] (transport-[8H32M51S31763]-[test-azimuth-app]-[rejecting]-request-processing-[test-app]-thread-11) 08:44:35.184 [transport-[8H32M51S31763]-[test-app]-[rejecting]-request-processing-[test-app]-thread-11] ERROR
org.hibernate.engine.jdbc.batch.internal.BatchingBatch - HHH000315: Exception executing batch [java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("SCHEME"."ADDRESS"."ID")
2019-10-23 08:44:35,185 INFO  [stdout] (transport-[8H32M51S31763]-[test-app]-[rejecting]-request-processing-[test-app]-thread-11) ], SQL: insert into address (is_actual, address, create_date, last_modification_date, city_id) values (?, ?, ?, ?, ?)
2019-10-23 08:44:35,185 INFO  [stdout] (transport-[8H32M51S31763]-[test-azimuth-app]-[rejecting]-request-processing-[test-azimuth-app]-thread-11) 08:44:35.185 [transport-[8H32M51S31763]-[test-app]-[rejecting]-request-processing-[test-app]-thread-11] ERROR
org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-01400: cannot insert NULL into ("SCHEME."ADDRESS"."ID")

Очевидно, что hibernate генерирует неправильный запрос и не генерирует идентификатор с помощью генератора последовательности: нет таких сообщений, как Hibernate: выберитеSEQ_ADDR.nextval из двойных в журналах. Есть ли у вас какие-либо предложения по этой проблеме? Большое спасибо!

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