Есть два способа сделать это: путь, который может привести к уродливой производительности, и путь, который является болезненным и неловким.
Потенциально уродливый путь сделан на конце ToOne. Используя аннотации Hibernate это будет:
@Entity
public class Foo
{
...
@ManyToOne
@JoinColumn( name = "DEVICEID" )
@NotFound( action = NotFoundAction.IGNORE )
private Device device;
...
}
К сожалению, это вызывает упреждающее обращение к базе данных (без отложенной загрузки), потому что устройство может иметь значение null, и если Hibernate создал отложенное устройство, тогда «device == null» никогда не будет иметь значение true.
Другой способ заключается в создании пользовательского типа пользователя, который перехватывает запросы для идентификатора 0 и возвращает для него значение null, а затем присваивает его первичному ключу устройства с помощью @Type. Это вынуждает интерпретацию 0 ~ null для каждого с внешним ключом в Device.