Hibernate-много к одной связи, возможность удалить последнюю общую ссылку автоматически?
У меня есть отношение "много к одному", и мне нравится, что последняя общая ссылка должна быть удалена hibernate автоматически. Эти вопросы
- это поддерживается hibernate?
- если нет, то я могу достичь этого, добавив некоторые обратные вызовы api из JPA/Hibernate, а не полностью закодировать его в DAOs самостоятельно?
Пример У меня есть " атрибут "(пара имя/значение), который является сущностью и его разделяет некоторый" перевод " для его имени с другими атрибутами. Поэтому, если атрибут удален, hibernate должен проверить, существует ли еще один атрибут, где используется тот же перевод. Если там никого не осталось, перевод также должен быть удален.
@Entity
public class Attribute {
@Id
@GeneratedValue
private int id;
private String name;
@Lob
private String value;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
@JoinColumn(name="name_translation_id")
private Translation nameTranslation;
...
}
@Entity
public class Translation {
@Id
@GeneratedValue
private int id;
@ElementCollection (fetch=FetchType.LAZY)
@CollectionTable(name= "translation_values", joinColumns = @JoinColumn(name = "translation_id"))
@MapKeyColumn(name="language_code")
@Column(name = "value")
@Lob
private Map<String, String> values = new HashMap<String, String>();
...
}
Я использую hibernate v4. 3.
1 ответ:
Я думаю, что Jpa
Entity Listeners
Хороший выбор для васДля вашего вопроса напишите один метод и anotate
@PostRemove
в атрибуте.класс@PostRemove public void removeTranslationByAttribute(Attribute attribute){ List<Attribute> attributes = AttributeRepository.getByNameTranslationId(attribute.getNameTranslation()); //get all atribute by `name_translation_id` if(attributes.size() == 0) // when not include atrribute in list`name_translation_id` TranslationRepository.deleteById(attribute.getNameTranslation()); // delete translation object by `name_translation_id` }