У меня есть простое приложение 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 из двойных в журналах. Есть ли у вас какие-либо предложения по этой проблеме? Большое спасибо!