В самом деле, вы должны иметь как не-арг конструктор и методы получения и установки. Требования указаны в разделе 2.1 раздела spec.
Требование конструктора без аргументов можно найти на странице 17, в моем экземпляре:
класса
Предприятия должен иметь не-Arg конструктора. Класс объекта может также иметь других конструкторов. Конструктор no-arg должен быть открыт или защищен.
страница 18 имеет требование методов доступа:
Постоянное состояние субъекта является представлен переменными экземпляра, , которые могут соответствовать ява Фасоль свойства. Переменная экземпляра может иметь вид только с использованием метода объекта с помощью объекта-объекта . У экземпляра переменные не должны быть доступны клиентам объекта. Состояние . Объект доступен для клиентов только через аксессуар объекта методов (методы getter/setter) или другие бизнес-методы. Экземпляры переменные должны быть частными, защищенными, или видимостью пакета.
Поле против доступа к собственности указывает, как поставщик JPA взаимодействует с вашей сущностью, а не как клиентское приложение взаимодействует с ним. Клиент должен всегда использовать методы get и set.
Некоторые поставщики JPA более мягкие в этих требованиях, и вы можете сделать конструктор закрытым (как было предложено выше) с конкретным поставщиком. Приложение может быть не переносимым, так что вы можете оказаться в неожиданности, если будете мигрировать в будущем.
Поэтому я бы не рекомендовал полностью исключать методы. Чтобы решить проблему, я бы назвал публикацию no-arg ctor устаревшей (добавьте что-то в javadoc о том, что она используется только для провайдера JPA). Методы набора могут содержать логику, которую вы хотите сохранить ваши инварианты.
Это не идеал, но это должно помешать неправильному использованию ctor случайно (я предполагаю, что у вас есть ctor, который устанавливает инварианты).
также может быть защищен, а не публично –