Это не повторяющаяся проблема, другие не имеют такой же сценарий
Моя проблема похожа на этот комментарий: nullable = false не только создает ограничение базы данных, но его решение отключает все проверки обнуляемости из спящего режима, чего я не хочу, я хочу именно это в этих отношениях @ManyToOne.
У меня есть класс RegraValidacao.java, который иногда может иметь только одиниз его полей @ManyToOne установлено, остальные нулевые.Эти отношения @ManyToOne создаются с помощью @JoinTable.То, что я хочу: при генерации моего DDL с помощью spring.jpa.properties.hibernate.hbm2ddl.auto , я хочу, чтобы @JoinColumns, присутствующая в аннотации @JoinTable, генерировала ограничение базы данных NOT NULL только для моей базы данных db2.
Таким образом, RegraValidacao может иметь @ManyToOne обнуляемые отношения с сущностями ContaLimite.java и Documento.java.Все будет в порядке, чтобы сохранить RegraValidacao, который имеет только ContaLimite.java, например:
RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);
hibernate.save(rgr) // SHOULD WORK
Но когда я установлю nullable = false на моем JoinColumn, он не позволитполе Documento должно быть нулевым.
@Entity
public class RegraValidacao {
@ManyToOne
@JoinTable(name = "CDR_CONTA_LIMITE_REGRA",
joinColumns = {@JoinColumn(name = "RGR_ID", nullable = false)},
inverseJoinColumns = {@JoinColumn(name = "CDL_ID", nullable = false)})
private ContaLimite contaLimite;
@ManyToOne
@JoinTable(name = "DOR_DOCUMENTO_REGRA",
joinColumns = {@JoinColumn(name = "RGR_ID", nullable = false)},
inverseJoinColumns = {@JoinColumn(name = "DOM_ID", nullable = false)})
private Documento documento;
}
РЕДАКТИРОВАТЬ: Для упрощения я просто поместил эти два атрибута, но на самом деле у меня есть 8 пар Attributtes / JoinTables в этом классе.И почему?Потому что эти отношения взаимно исключены.Если бы у меня были общие табличные отношения @ManyToOne без JoinTables, у меня было бы 7 пустых полей в базе данных и 1 набор.С JoinTables у меня не будет пустых полей, и если в JoinTable установлен идентификатор, то, безусловно, есть запись в связанных таблицах.
Другими словами, связь с ContaLimite.java и Documento.java должнаbe: необязательный = true, но их столбцы в @JoinTable должны иметь значение nullable = false.
Что я ожидаю: Таблицы, созданные с помощью hbm2ddl.auto:
CDR_CONTA_LIMITE_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
DOR_DOCUMENTO_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
Сохранение с помощью Hibernate:
RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);
hibernate.save(rgr) // SHOULD BE OK!
Что я получаю: Таблицы, созданные с помощью hbm2ddl.auto:
CDR_CONTA_LIMITE_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
DOR_DOCUMENTO_REGRA --> RGR_ID NOT NULL, CDL_ID NOT NULL //OK
Сохранение с помощью Hibernate:
RegraValidacao rgr = new RegraValidacao();
rgr.setContaLimite(new ContaLimite());
rgr.setDocumento(null);
hibernate.save(rgr) --> Error, cannot persist null
ERROR: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : br.system.regravalidacao.RegraValidacao.documento; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : br.system.regravalidacao.RegraValidacao.documento
Таким образом, я ожидаю, что столбцы JoinTable будут иметь ограничение NOT NULL, но я все еще могу сохранить RegraValidacao с нулевым Documento.