Java 如何在带注释的hibernate中引入ondelete级联
我刚开始冬眠。我需要在hibernate中引入带有注释的删除功能。一旦我们删除父记录,它就需要删除子记录,即我需要引入ondelete级联功能。你能帮我介绍一下这个功能吗。请在下面找到java/实体代码Java 如何在带注释的hibernate中引入ondelete级联,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我刚开始冬眠。我需要在hibernate中引入带有注释的删除功能。一旦我们删除父记录,它就需要删除子记录,即我需要引入ondelete级联功能。你能帮我介绍一下这个功能吗。请在下面找到java/实体代码 @Entity @Table(name = "atfLabel", uniqueConstraints = @UniqueConstraint(columnNames = {"key_", "module_id"})) @SuppressWarnings("serial") public cla
@Entity
@Table(name = "atfLabel", uniqueConstraints = @UniqueConstraint(columnNames = {"key_", "module_id"}))
@SuppressWarnings("serial")
public class Label {
private long id;
private ModuleImpl module;
private String key;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@ManyToOne(optional=false)
@JoinColumn(name="module_id", nullable=false, updatable=false)
public ModuleImpl getModule() {
return module;
}
public void setModule(ModuleImpl module) {
this.module = module;
}
@Column(name="key_", length=160)
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
@Entity
@Table(name = "atfModule")
@SuppressWarnings("serial")
public class ModuleImpl implements Module {
private long id;
private String name;
private String description;
@OneToMany(mappedBy="module")
@Cascade(CascadeType.DELETE)
private List<Label> label;
@Override
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
@Column(length=200, unique=true, nullable=false)
public String getName() {
return name;
}
@Override
@Column(length=2000)
public String getDescription() {
return description;
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public void setDescription(String desc) {
this.description=desc;
}
}
@Entity
@Table(name = "atfLabelText",
uniqueConstraints = @UniqueConstraint(columnNames = { "label_id", "tenant_id", "locale" }))
@SuppressWarnings("serial")
public class LabelText {
private long id;
private Label label;
private TenantImpl tenant;
private String locale;
private String text;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return id;
}
@ManyToOne(optional = false)
@JoinColumn(name = "label_id", nullable = false, updatable = false)
public Label getLabel() {
return label;
}
public String getLocale() {
return locale;
}
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "tenant_id", nullable = true, updatable = false)
public TenantImpl getTenant() {
return tenant;
}
@Column(length = 1500)
public String getText() {
return text;
}
public void setId(long id) {
this.id = id;
}
public void setLabel(Label label) {
this.label = label;
}
public void setLocale(String locale) {
this.locale = locale;
}
public void setTenant(TenantImpl tenant) {
this.tenant = tenant;
}
public void setText(String text) {
this.text = text;
}
}
@实体
@表(name=“atfLabel”,uniqueConstraints=@UniqueConstraint(columnNames={“key_”,“module_id”}))
@抑制警告(“串行”)
公共类标签{
私人长id;
私有模块impl模块;
私钥;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@多通(可选=假)
@JoinColumn(name=“module_id”,nullable=false,updateable=false)
公共模块impl getModule(){
返回模块;
}
公共空集合模块(ModuleImpl模块){
this.module=模块;
}
@列(name=“key”,长度=160)
公共字符串getKey(){
返回键;
}
公共无效设置键(字符串键){
this.key=key;
}
}
@实体
@表(name=“atfModule”)
@抑制警告(“串行”)
公共类ModuleImpl实现模块{
私人长id;
私有字符串名称;
私有字符串描述;
@OneToMany(mappedBy=“模块”)
@级联(级联类型.删除)
私有列表标签;
@凌驾
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@凌驾
@列(长度=200,唯一性=true,可空性=false)
公共字符串getName(){
返回名称;
}
@凌驾
@列(长度=2000)
公共字符串getDescription(){
返回说明;
}
@凌驾
公共void集合名(字符串名){
this.name=name;
}
@凌驾
公共void setDescription(字符串描述){
此.description=desc;
}
}
@实体
@表(name=“atfLabelText”,
uniqueConstraints=@UniqueConstraint(columnNames={“label\u id”、“tenant\u id”、“locale”}))
@抑制警告(“串行”)
公共类标签文本{
私人长id;
自有品牌;
私人租户;
私有字符串区域设置;
私有字符串文本;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
@多通(可选=假)
@JoinColumn(name=“label\u id”,nullable=false,updateable=false)
公共标签getLabel(){
退货标签;
}
公共字符串getLocale(){
返回区域设置;
}
@manytone(可选=true,fetch=FetchType.LAZY)
@JoinColumn(name=“tenant\u id”,nullable=true,updateable=false)
公共租户{
归还承租人;
}
@柱(长度=1500)
公共字符串getText(){
返回文本;
}
公共无效集合id(长id){
this.id=id;
}
公共无效设置标签(标签标签){
this.label=标签;
}
公共void setLocale(字符串区域设置){
this.locale=locale;
}
公共无效设置(租户){
this.tenant=租户;
}
公共void setText(字符串文本){
this.text=文本;
}
}
你能帮我做删除功能和ondelete级联吗。
谢谢
Vijaya Kumar当您使用级联类型时。删除:
@OneToMany(mappedBy="module")
@Cascade(CascadeType.DELETE)
private List<Label> label;
使用
all delete orphan
,如果标签
被持久化模块
引用,则任何新实例化的标签
都将成为持久化的。当模块
被删除时,如果某个模块
引用了任何持久的标签
,则该标签将被删除。而且,如果使用级联类型时从持久模块
的标签
集合中删除了任何持久标签
,则该标签将被删除。删除
:
@OneToMany(mappedBy="module")
@Cascade(CascadeType.DELETE)
private List<Label> label;
使用
all delete orphan
,如果标签
被持久化模块
引用,则任何新实例化的标签
都将成为持久化的。当模块
被删除时,如果某个模块
引用了任何持久的标签
,则该标签将被删除。而且,如果从持久性模块的标签集合中删除任何持久性标签
,也将删除它,原因是:org.hibernate.exception.ConstraintViolationException:无法在org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:96)上执行JDBC批处理更新org.hibernate.jdbc.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)org.hibernate.engine.engine.ActionQueue.executeActions(ActionQueue.java:189)原因:java.sql.BatchUpdateException:无法删除或更新父行:外键约束失败(lportal
atflabeltext
,约束FKA6C78EE9D4FD6A4
外键(label\u id
)引用atflabel
(id
))位于com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1257)让我猜猜你想要实现什么。如果我错了,请纠正我。你想要创建并持久化一个带有一组标签的模块的实例。当你删除模块的持久化实例时,相关的标签也应该与模块一起删除。如果这是你想要的t、 您需要使用all delete orphan
。这样,您就不需要单独保存label
。在ModuleImpl
类中定义addLabel
方法:public voi