نقابة الصحفيين حذف مع 2 فئات المتشابكة الكيان

StackOverflow https://stackoverflow.com/questions/807547

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد 2 EJB 3 الفول الكيان:

@Entity
public class Organisation
{
    @Id
    @Column(length = 64)
    private String guid;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @JoinColumn(name = "home_unit_fk", nullable = true)
    private Unit homeUnit;          
}

@Entity
public class Unit
{
    @Id
    @Column(length = 64)
    private String guid;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organisation_fk", nullable = false)
    private Organisation organisation;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_unit_fk", nullable = true)
    private Unit parentUnit;

    @OneToMany(mappedBy = "parentUnit", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @OrderBy("shortName")
    @OptimisticLock(excluded = true)
    private Set<Unit> childUnits;   
}

إذا كنت لا لحذف على المنظمة باستخدام داو القياسية:

public int deleteByGuid(final String guid) 
{
    final Query query = entityManager.createQuery("delete from " + getPersistentClass().getName() + " where guid = :guid");
    query.setParameter("guid", guid);
    return query.executeUpdate();
}

ولكن يمكنني الحصول على الاستثناء التالي:

وcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: لا يمكن حذف أو تحديث صف الأم: فشل قيد مفتاح خارجي (config.unit، CONSTRAINT FK27D184F5D4393D FOREIGN KEY (organisation_fk) مراجع organisation (guid))

وأنا لا تحصل عليه. ما الخطأ الذي افعله؟ لا ينبغي أن JPA / السبات أداء الحذف على كل وحدة ومنظمة داخل نفس المعاملة؟

هل كانت مفيدة؟

المحلول

والجزء الأكبر حذف الاستعلام لم يتم تحميل الأشياء في الذاكرة ويتجاوز أي شلال المحددة في الجمعيات.

وأود أن رمز طريقة الحذف الخاص بك على النحو التالي:

public int deleteByGuid(final String guid){
    Organization org = entityManager.find(Organization.class, guid);
    entityManager.remove(org);
}

إذا كنت تستخدم استعلام للقيام التحديثات السائبة، وتفويض العملية إلى قاعدة البيانات مباشرة. إذا كنت ترغب في حذف الأشياء طفل، لديك لتعيين مشغل تتالي حذف على مستوى "قاعدة بيانات".

وبواسطة تحميل الكائن وإزالته، والسبات تحريك شلال على مستوى "وجوه".

والمزيد من المعلومات على الموقع: <لأ href = "http://twasink.net/blog/2005/04/differences-in-behaviour-between-hibernate-delete-queries-and-the-old-way/" يختلط = "نوفولو noreferrer"> http://twasink.net/blog/2005/04/differences-in-behaviour-between-hibernate-delete-queries-and-the-old-way/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top