Лучше всего делать это в базе данных, не споря об этом. Ссылочная целостность, обрабатываемая в коде приложения, всегда нарушается в какой-то момент, хотя бы потому, что люди имеют тенденцию обращаться к таблицам из нескольких приложений и вручную.
Программно вы можете проверить, создав запрос, который проверяет, существует ли что-то, что ссылается на человека. Я бы использовал JPA QL или HQL или даже Criteria, не нужно опускаться до SQL. Достаточно одного запроса (в сочетании с ИЛИ). Хитрость заключается в том, чтобы найти все объекты и поля для включения в запрос. Для одного случая это просто, сделайте запрос вручную. Вы, вероятно, знаете, на что ссылается Person, если вы не можете искать в IDE или проверить ограничения в базе данных. В общем случае вы хотите сгенерировать этот код или создать его на лету.
Для построения на лету, EntityManager.getMetamodel()
даст вам все сущности, так что вы можете просмотреть их атрибуты и посмотреть, есть ли потенциальные ссылки на сущность, с которой вы работаете. Громоздкие.
Генерирование кода на основе аннотированных классов может быть сложным, но если вы знаете, какие классы проверять (и если вы перечисляете их в своем модуле персистентности, которые вы делаете), это становится намного проще. Просмотрите перечисленные классы, прочитайте аннотации и сгенерируйте проверочный код.
Если вы действительно намерены сделать это в общем виде программно, я бы начал с ручного изготовления первых двух реализаций. Тогда я бы использовал это как основу для сгенерированного кода.