2015-09-15 2 views
3

Учитывая Hibernate/JPA объект с набором каскадным для ALL взаимосвязанного лица:Возможно ли временно отключить каскадирование для объекта Hibernate?

@Entity 
public class Entity { 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "entity") 
    private Set<RelatedEntities> relatedEntities; 
} 

Можно ли временно отключить каскадирование, например, чтобы объект Entity сохранялся, не сохраняя также связанных с ним событий?

+0

Если вы используете ограничения каскада, вы можете перенести Entity без проверки ограничений сразу же после использования ограничения DEFERRABLE INITIALLY IMMEDIATE. Но в конце транзакции вы должны сохранить также связанные события. Подробнее: http://stackoverflow.com/questions/5300307/not-deferrable-versus-deferrable-initially-immediate –

+0

Спасибо, но не уверены, как это будет работать, поскольку ссылка ссылается на ключевое слово SQL, но каскады управляются от Hibernate? –

+0

Каскады наверняка управляются db (если вы не используете параметр create by hibernate, вы должны их создать), я подозреваю, что спящий режим также может проверять ограничения, если вы добавляете аннотации, но я их не использую. Если вы хотите сохранить Entity без связанных с ним событий, возможно, структура db неправильно спроектирована? –

ответ

1

Нет, это невозможно сделать, и, по крайней мере, по моему скромному мнению, было бы неплохо также сделать это. Когда другие разработчики смотрят на сопоставления и код, который выполняет persist/merge/delete ..., они ожидали бы применения каскадов и введения неожиданного поведения, если они будут наблюдать за тем, что каскады временно отключены в другом месте для кода, который они представляют изменить.

Однако вы можете сопоставить с той же таблицей новый класс сущностей, который не имеет полей, которые каскадированы. Затем просто используйте эту сущность в ситуациях, когда вы не хотите применять каскады.

+0

Пример использования немного сложно объяснить, но в основном объект используется в качестве посредника для передачи данных из пользовательского интерфейса. В этом случае связанные объекты должны быть восстановлены и сохранены один за другим, а не обычный случай каскадирования. Второе предложение может быть работоспособным - моя единственная оговорка в том, что это неизбежно создаст некоторое дублирование, но это может быть смягчено путем реорганизации общих частей в родительский класс. –

1

Вы не можете временно отключить каскадные (насколько мне известно, по крайней мере), но так как вы используете Hibernate вы можете insert new entity using HQL

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; 
int createdEntities = s.createQuery(hqlInsert).executeUpdate(); 

Существует всегда «ручное» решение, в котором вы помните relatedEntities в переменной для последующего использования и установить значение null в качестве значения на Entity экземпляра перед его сохранением.

+0

Предпочитаете избегать решения HQL, поскольку оно не является безопасным по типу и очень хрупким в отношении изменения сущностей. «Ручное» решение кажется более многообещающим, если оно работает - установит ли связанные свойства «null» недействительным, если они будут присутствовать? –

+0

Это другой вопрос, чем ваш оригинал, поскольку он касается обновления существующих объектов вместо того, чтобы вставлять новые. Я должен был бы проверить, но поскольку 'RelatedEntity' является стороной-обладателем отношения, если вы не устанавливаете' null' в 'RelatedEntity # entity', я думаю, что все должно быть хорошо. –

+0

Спасибо, исходный вопрос должен был быть довольно широким для всех каскадных операций. (Персист был всего лишь примером - извините, если я этого не сделал). –