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 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`

}