Hibernate Cascaded update for a column without a primary key

I have two tables with a structure like this.

  • Tables:

1) Table Obj -

enter image description here

2) subobj table

enter image description here

There is an is_deleted column in my script, when I delete, I don’t want to delete records, instead I want to set is_deleted to true and update the necessary dependencies.

  • Detailed scenarios:

1) consider that the user deletes a row from the obj table that has the identifier 1. Now the rows of subobjects associated with obj_id 1 should set is_deleted to true.

2) subobj fk 'parent_subobj'. , , subobj 2, is_deleted 'parent_subobj' 2.

: ( JBOSS)

Obj: -

@Entity
@Table(name = "obj", schema = "public")
public class Obj implements java.io.Serializable
{
  private static final long serialVersionUID = 1L;

  @Id
  @Column(name = "id", unique = true, nullable = false)
  private int id;

  @Column(name = "obj_name", length = 100)
  private String objName;

  @Column(name = "is_deleted")
  private Boolean isDeleted;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "obj")
  private Set<Subobj> subobjs = new HashSet<Subobj>(0);
 // getters and setters
}

Subobj: -

@Entity
@Table(name = "subobj", schema = "public")
public class Subobj implements java.io.Serializable
{
  @Id
  @Column(name = "id", unique = true, nullable = false)
  private int id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "obj_id")
  private Obj obj;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parent_subobj")
  private Subobj subobj;

  @Column(name = "subobj_name", length = 100)
  private String subobjName;

  @Column(name = "is_deleted")
  private Boolean isDeleted;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "subobj")
  private Set<Subobj> subobjs = new HashSet<Subobj>(0);
} 

Hibernate . ,

+4
1

Hibernate PostgreSQL "" , . "" , . , java-, , ( , Java ).

obj:

CREATE FUNCTION del_obj() RETURNS trigger AS $$
BEGIN
  UPDATE obj SET is_deleted = true WHERE id = OLD.id;
  UPDATE subobj SET is_deleted = true WHERE obj_id = OLD.id;
  RETURN NULL; -- fail the delete operation
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER tr_del_obj
  BEFORE DELETE ON obj
  FOR EACH ROW EXECUTE PROCEDURE del_obj();

subobj:

CREATE FUNCTION del_subobj() RETURNS trigger AS $$
BEGIN
  UPDATE subobj SET is_deleted = true WHERE id = OLD.id;
  DELETE FROM subobj WHERE parent_subobj = OLD.id;
  RETURN NULL; -- fail the delete operation
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER tr_del_subobj
  BEFORE DELETE ON subobj
  FOR EACH ROW EXECUTE PROCEDURE del_subobj();

. is_deleted ( ), , . , "" subobj id=2, is_deleted true, parent_subobj=2 "". is_deleted - . : id=2;parent_subobj=3, id=3;parent_subobj=2, . , parent_subobj CTE, .

+2

All Articles