سؤال

لدي كائنات منتجات تنتمي إلى فئات معينة، على سبيل المثال.علاقة كلاسيكية متعددة إلى واحدة.

@Entity
public class Product{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String name;
    Double price;
    @ManyToOne(fetch = FetchType.LAZY)
    Category category;
...
}

@Entity
public class Category implements Identifiable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
...
}

أريد إدراج المنتجات وتحديثها دون تحديد الفئات مسبقًا.مثله:

Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);

أو

Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);

هل من الممكن التحديث والإدراج دون اختيار الفئة؟لا أريد استخدام HQL أو الاستعلامات المباشرة لذلك.

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

المحلول

تحميل الجلسة () موجود خصيصًا لمثل هذه الحالات.الأتى:

Category category = session.load(categoryId);
product.setCategory(category);

لن تصل إلى قاعدة البيانات.ومع ذلك، سيتم طرح استثناء في مرحلة لاحقة (أثناء التدفق، أكثر أو أقل) إذا لم تكن هناك فئة متاحة بالمعرف المحدد.

استخدام load() أسرع من merge() وليس له أي آثار جانبية (المتتالية، الخ...)

نصائح أخرى

والسبات يحتاج إلى طريقة آمنة لتحديد حالة الكائن. هذا هو السبب في انه سيكون طريقا طويلا للتأكد من أنك لا يمكن خلط الأشياء من دورات مختلفة (حتى لا يمكن تحميل الفئات عند بدء التشغيل ثم مجرد استخدامها لاحقا).

والحل هو تحميل الفئات عند بدء التشغيل، وإنشاء مزود التخزين المؤقت مثل ehcache لهذه الفئة ومن ثم استخدام هذا الرمز:

Product product = new Product(somename);
product.setCategory(session.merge(category));

وهذا لن يسبب أي DB رحلات ذهابا وإيابا في حالة تكوين ذاكرة التخزين المؤقت هذه الفئة من الحالات لا يمكن تغيير.

ولقد حاولت فقط التالية:

Category category = new Category(categoryId);
product.setCategory(category);

وانها عملت، أعني سجل المنتج في ديسيبل حصلت الرابط الصحيح لفئة وفئة بالمعرف

categoryId

ولم تتغير.

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