JPA необязательное отношение - PullRequest
0 голосов
/ 18 июня 2020

Я использую EclipseLink.

У меня есть объект DIDRequest, который имеет отношение «один ко многим» с DIDAllocation.

DIDRequest не всегда связан с DIDAllocation (т. Е. DIDAlloction должен быть необязательным).

У меня есть следующая сущность

@Entity
@Table(name = "tblDIDRequest")
public class DIDRequest 
{
    int id;
    @ManyToOne(optional = true)
    private DIDAllocation didAllocation;
}

Аргумент optional, похоже, не работает, поскольку EclipseLink генерирует ограничение внешнего ключа следующим образом:

CREATE TABLE `tblDIDRequest` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `DIDALLOCATION_ID` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `FK_tblDIDRequest_DIDALLOCATION_ID` (`DIDALLOCATION_ID`),
  CONSTRAINT `FK_tblDIDRequest_DIDALLOCATION_ID` FOREIGN KEY (`DIDALLOCATION_ID`) REFERENCES `tblDIDAllocation` (`ID`),

);

Как мне изменить аннотацию, чтобы она не генерировала ограничение внешнего ключа?

Есть ли способ установить ограничение, так что если didAllocation существует, тогда должна быть связанная сущность, но если это нуль, нам все равно?

1 Ответ

2 голосов
/ 18 июня 2020

Это работает так же, как и должно!

обязательная ассоциация может быть отображена с помощью ограничения NOT NULL для столбца (чтобы убедиться, что оно имеет значение), а также FOREIGN KEY, чтобы убедиться, что значение соответствует идентификатору в другой таблице.

Если у вас есть необязательная ассоциация, вам все равно нужно ограничение FOREIGN KEY, поэтому вы не можете просто поставить gibberi sh в колонку. Но у вас нет ограничения NOT NULL, поэтому NULL указывает, что «ассоциация отсутствует».

`DIDALLOCATION_ID` bigint(20) DEFAULT NULL,

Это допускает значение NULL и имеет значение по умолчанию NULL.

Вы можете также хотите установить fetch = FetchType.LAZY для ассоциации и явно присоединяться / загружать ее только тогда, когда вам это нужно - для эффективности. И в целом я настоятельно рекомендую все статьи Влада Михалча, чтобы узнать больше об эффективном использовании JPA: https://vladmihalcea.com/manytoone-jpa-hibernate/

...