+1 امتیاز
قبل در برنامه نویسی توسط (28 امتیاز)
ویرایش شده قبل توسط

سه تا جدول داریم که به صورت زیر می باشد . سوالم اینه که فرض کنید سطری از جدول Table1 حذف میشه حالا چطور باید سایر سطرهایی که با کلید خارجی با سطر حذف شده ارتباط دارند رو حذف کرد. روشی که استفاده کردم این بود که اول سطرهای مربوط به Table2 و Table3 رو حذف کردم بعد سطر مربوط به Table1 رو حذف کردم. فک میکنم این روش هزینه بره!

@Entity
@Table(name = "Table1")
public class Entity0 implements Serializable{
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "foriegnID")
    private Integer foriegnID;

    @OneToOne(fetch =FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "map_name")
    private Entity entity1;

    @OneToMany(mappedBy = "map_name", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Entity2> entities;

===================================================

@Entity
@Table(name = "Table2")
public class Entity1 implements Serializable{
private static final long serialVersionUID = 1L;

    @Id
    @GenericGenerator(name = "generator", strategy = "increment")
    @Column(name = "id")
    private int id;

    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="foriegnID",
         insertable=true, updatable=false,
         nullable=true)

    private Entity0 entity0;

======================================================

@Entity
@Table(name = "Table3")
public class Entity2{

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="foriegnID",
            insertable=true, updatable=true,
            nullable=true)
    private Entity0 entity0;

پیشنهاد شما چیه؟

ممنون

2 پاسخ

+1 امتیاز
قبل توسط (28 امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

کد مربوط به حذف مورد خواسته شده در سوال:

@Transactional
public void deleteEntity0(int entity0Id) {
  Entity0   entity0;
   entity0 =  entityService.getEntity0(entity0Id);//
  sessionFactory.getCurrentSession().delete(entity0);
}
+1 امتیاز
قبل توسط (1.1هزار امتیاز)

 کافی است در روابط OneToMany و OneToOne که در Entity0 وجود دارد از CascadeType.REMOVE یا CascadeType.ALL استفاده کنید. حالا در صورتی که Entity0 را remove کنید بصورت خودکار Entity1 و Entity2 نیز remove می شوند.

قبل توسط (28 امتیاز)
این کارو انجام دادم ولی فقط سطر مربوط به Entity0 حذف میشه. و یه استثنا پرتاپ میشه
org.hibernate.ObjectNotFoundException: No row with the given identifier exists
قبل توسط (1.1هزار امتیاز)
لطفا تکه کد کاملی که برای حذف Entity0 نوشته اید را هم بگذارید (session یا transaction یا ...)
قبل توسط (28 امتیاز)
ممنون آقای زرین فام مشکلم حل شد. ایراد هم در کد مربوط به حذف Entity0 بود که با رفع اون مشکل حل شد. فقط یه سوال برام پیش اومده اونم اینه که هزینه این عمل نسبت به حالتی که از کدهای sql استفاده میکردیم بیشتر نیست؟
قبل توسط (1.1هزار امتیاز)
اختلاف performance آنقدر ناچیزه که با توجه به امکاناتی که ORM به شما می دهد کاملا قابل اقماض است.
قبل توسط (1.1هزار امتیاز)
لطفا اگر مشکلتون حل شده خودتون جواب سوال رو بدهید تا در آینده بدرد بقیه هم بخوره. تشکر.
قبل توسط (28 امتیاز)
حتما جواب رو میزارم. لطف کنید بگین که روش درستی هست یا نه؟
قبل توسط (1.1هزار امتیاز)
بله حتما بهتره که از این روش رفتید. در زمان استفاده از ORM این روش که شما رفته اید توصیه می شود تا اجرای مستقیم query.

سوالات مشابه

+1 امتیاز
1 پاسخ 904 بازدید
سوال شده 4 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
0 امتیاز
0 پاسخ 645 بازدید
+1 امتیاز
1 پاسخ 416 بازدید
0 امتیاز
1 پاسخ 298 بازدید
سوال شده 4 سال قبل در برنامه نویسی توسط masoud65 (27 امتیاز)
0 امتیاز
1 پاسخ 590 بازدید
سوال شده 4 سال قبل در برنامه نویسی توسط 1993 (242 امتیاز)
0 امتیاز
3 پاسخ 695 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
+1 امتیاز
0 پاسخ 264 بازدید
0 امتیاز
1 پاسخ 405 بازدید
...