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

Java 休眠-多对一关系,是否可以自动删除最后一个共享引用?,java,hibernate,many-to-one,cascading-deletes,Java,Hibernate,Many To One,Cascading Deletes,我有一个多对一的关系,我喜欢hibernate自动删除最后一个共享引用。问题是 hibernate支持这一点吗 如果没有,我可以通过添加来自JPA/Hibernate的某种api回调来实现这一点,而不是自己在DAOs中完全编码它吗 例如,我有一个“属性”(名称/值对),它是一个实体,它的名称与其他属性共享一些“翻译”。因此,如果一个属性被删除,hibernate应该检查在使用相同翻译的地方是否还存在另一个属性。如果没有人留下,翻译也应该删除 @Entity public class Attr

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

  • hibernate支持这一点吗
  • 如果没有,我可以通过添加来自JPA/Hibernate的某种api回调来实现这一点,而不是自己在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>();
    ...
}
@实体
公共类属性{
@身份证
@生成值
私有int-id;
私有字符串名称;
@高球
私有字符串值;
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
@JoinColumn(name=“name\u translation\u id”)
私人翻译;
...
}
@实体
公共课翻译{
@身份证
@生成值
私有int-id;
@ElementCollection(fetch=FetchType.LAZY)
@CollectionTable(name=“translation\u values”,joinColumns=@JoinColumn(name=“translation\u id”))
@MapKeyColumn(name=“语言\代码”)
@列(name=“value”)
@高球
私有映射值=新的HashMap();
...
}

我正在使用hibernate v4.3。

我认为Jpa
实体侦听器是您的好选择

对于你的问题,在Attribute.class中写一个metod和一个tate
@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`

}
@PostRemove
public void removeTransationByAttribute(属性){
List attributes=AttributeRepository.getByNameTranslationId(attribute.getNameTranslation());//通过'name\u translation\u id'获取所有atribute`
if(attributes.size()==0)//当列表'name\u translation\u id'中不包含属性时`
TranslationRepository.deleteById(attribute.getNameTranslation());//按'name\u translation\u id'删除翻译对象`
}