2015-04-21 6 views
0

У меня есть странный вопрос, простите меня, если я ошибаюсь.Как исключить объект сопоставления в Hibernate

Мой вопрос здесь, у меня есть определение ManyToOne, определенное для двух объектов в моем приложении. При удалении я хочу игнорировать удаление другого объекта.

Предположим, что Emp to Dept имеет отношение ManyToOne, и я удаляю запись Emp через session.delete (EmpId), в настоящее время я не хочу удалять Dept, связанный с объектом Emp.

Я не могу изменить каскадный вариант в hbm.

сценарий что-то вроде

", если есть 10 EMPS принадлежащие DEPT номер 101 и во время удаления любой один EMP он будет пытаться удалить связанный с ним Dept и который не представляется возможным, как у нас есть некоторые другие записи emp, относящиеся к одному и тому же департаменту "

Так что есть способ игнорировать удаление записи dept при удалении emp записи программно. Почему программатически, но здесь мне нужно рассмотреть вариант каскада при удалении последней записи emp, связанной с записью dept 101. И я не хочу рассматривать параметр каскада при удалении 9 объектов emp.

Просьба предложить мне работать для этого сценария.

Большое спасибо!

+2

* Я не могу изменить каскадный вариант в hbm. * Почему? – ben75

+0

какое отображение вы используете? xml или аннотация – Dev

+0

@ ben75, я не могу изменить hbm, потому что мы импортируем часть объектов модели и hbms из другой импортированной банки, в которой мы не можем делать никаких изменений. – Jai

ответ

0

Попробуйте удалить его с помощью HQL, он игнорирует конфигурацию каскада.

session.createQuery("delete from Employee where id = ?").setParameter(0, empId).executeUpdate(); 

Однако, если есть другие лица, уже загружены в Hibernate сессии, которая по-прежнему ссылаться на тот, который вы удален, вы можете получить EntityNotFoundException. Вам придется самому справиться с этим.

0

Из Вашего вопроса я создал классы сущностей, как показано ниже, чтобы объяснить свой ответ в правильном пути,

Примечание: - Классы сущностей только мое предположение, вы могли бы реализации его по-разному

@Entity 
@Table(name="EMPLOYEE") 
public class Emp implements Serializable { 
    @Id 
    @GeneratedValue() 
    @Column(name="ID") 
    private Long empId; 

    @ManyToOne 
    @JoinColumn(name="DEPARTMENT_ID") 
    private Dpt department; 

    other property 
    ... getter() setter() 
} 

@Entity 
@Table(name="DEPARTMENT") 
public class Dpt implements Serializable { 
    @Id 
    @GeneratedValue() 
    @Column(name="ID") 
    private Long dptId; 

    @OneToMany(mappedBy = "department",cascade=CascadeType.ALL) 
    @Cascade(CascadeType.DELETE_ORPHAN) 
    private Set<Emp> employeeSet; 

    other property 
    ... getter() setter() 
} 

по вашему требованию я создал двунаправленную связь в выше фрагменте кода

Задача 1

Пусть Emp в МЭИ имеет ManyToOne отношение, и я удаление Emp записи через session.delete (EmpId), в это время я не хочу, чтобы удалить Dept связанного с Emp объекта.

Ответ здесь вы выполняете

session.delete(EmpId) 

в вашем коде, если вы делаете что-то вроде ниже

@ManyToOne 
    @JoinColumn(name="DEPARTMENT_ID",cascade=CascadeType.ALL) 
    private Dpt department; 

    or 

    @ManyToOne 
    @JoinColumn(name="DEPARTMENT_ID",cascade=CascadeType.DELETE) 
    private Dpt department; 

только тогда JPA попытаться удалить родительский (ДПТ) при удалении ребенка (Emp)

Примечание: - Никогда не используйте casca де с @ManyToOne

Вот если вы удалите каскад из @ManyToOne должен решить ваш вопрос (удаление родителя (ДПТ) при удалении ребенка (ЭМИ))

Задача 2

мне нужно рассмотрите возможность каскада при удалении последней записи emp , связанной с дептом 101 записи. И я не хочу рассматривать параметр каскада при удалении 9 объектов emp.

Вы можете обрабатывать выше сценарии programmaticly, для объектов 9 эх вы можете использовать

session.delete(EmpId) 

и 10 сотрудника

session.delete(DptId) 

Здесь в коде выше я использовал

@OneToMany(mappedBy = "department",cascade=CascadeType.ALL) 
     @Cascade(CascadeType.DELETE_ORPHAN) 
     private Set<Emp> employeeSet; 

Ее е функционирование @Cascade(CascadeType.DELETE_ORPHAN) является удаление всех детей (ЭЙ) лицами, если родитель (ДПТ) объект удаляется, в вашем случае удаления DPT предприятия также удаляет ваш последний альбом Emp, связанный с этим отделом

Надежда это поможет вам

Спасибо!

+0

OP сказал, что он не может изменять параметры каскада, сущности импортируются из другого проекта. –

+0

Я только что описал возможный сценарий возникновения ошибки в вышеупомянутом вопросе. – Dev

+0

Извинения за задержку ответа. Поскольку у нас не было работы для этой истории пользователей для этого спринта, я не искал решения к тому времени. Как бы мы ни работали для этого, теперь мы изменили требование удалить все дочерние записи, а затем родительскую запись. Раньше они не хотели удалять все дочерние записи для целей отчетности, теперь мы удаляем все записи, поэтому никаких проблем. – Jai

Смежные вопросы