java - Hibernate - 多对一关系,是否可以自动删除最后一个共享引用?

标签 java hibernate many-to-one cascading-deletes

我有一个多对一的关系,我喜欢最后一个共享引用应该被 hibernate 自动删除。问题是

  • hibernate 支持吗?
  • 如果不能,我可以通过从 JPA/Hibernate 添加某种 api 回调来实现这一点,而不是自己在 DAO 中完全编码吗?

示例 我有一个“属性”(名称/值对),它是一个实体,它的名称与其他属性共享一些“翻译”。因此,如果一个属性被删除,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。

最佳答案

我认为 Jpa Entity Listeners 对你来说是个不错的选择

对于你的问题,写一个方法并在 Attribute.class 中注释 @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`

}

关于java - Hibernate - 多对一关系,是否可以自动删除最后一个共享引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861731/

相关文章:

java - 如何检测二值图像中的圆圈

hibernate - java.sql.SQLException : Invalid value for getInt() - 'foo'

Django 多对一完整性错误

java - 使用Gradle将外部配置文件添加到jar

java - GUI Java Netbeans 多个类

java - 无法捕获java中的自定义异常

java - Hibernate (JPA) 在插入失败时保留分配的 ID

java - Hibernate二级缓存,通过属性关闭

java - Hibernate 注释不适用于 getter 但适用于属性

java - 如何访问多选条件元组查询中的连接列?