سؤال

لديّ foo لها علاقة بالعديد من البار.

عندما أقوم بحذف الشريط في نظامي ، أريد الاحتفاظ بها في قاعدة البيانات لسبب الأعمال المجنونة ، لذا قمت فقط بتعيين حقل محذوف على True.

هل يمكنني التحديد في رسم خرائط السباتي الذي أريد فقط أن يحمل مجموعتي عناصر حيث يكون هذا الحقل خطأ؟

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

المحلول

يوفر السبات المرشحات لانجاز هذا.

مثال على الفاصوليا:

public class Foo {
    private Long id;
    private String text;
    private Set<Bar> bars = new HashSet<Bar>();    
    // constructors, getters, setters
}

public class Bar {
    private Long id;
    private boolean deleted;
    private String text;
    // constructors, getters, setters
}

مثال على تعيينات NB: The filter عنصر

<hibernate-mapping package="org.nkl.hib">
  <class name="Foo">
    <id name="id" column="FOO_ID">
      <generator class="sequence" />
    </id>
    <property name="text" />
    <set name="bars" cascade="all" fetch="join">
      <key column="FOO_ID" />
      <one-to-many class="Bar" />
      <filter name="deleted" condition=":deleted = deleted" />
    </set>
  </class>
  <filter-def name="deleted">
    <filter-param name="deleted" type="boolean" />
  </filter-def>
</hibernate-mapping>

<hibernate-mapping package="org.nkl.hib">
  <class name="Bar">
    <id name="id" column="BAR_ID">
      <generator class="sequence" />
    </id>
    <property name="text" />
    <property name="deleted" />
  </class>
</hibernate-mapping>

مثال اختبار الوحدة:

public class FooBarTest {

    private static SessionFactory sessionFactory;

    @AfterClass
    public static void closeSessionFactory() {
        sessionFactory.close();
    }

    @BeforeClass
    public static void setupSessionFactory() {
        Configuration configuration = new Configuration();
        configuration.configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    @Test
    public void testBarFilter() {
        doInTransaction(new Command() {
            public void execute(Session session) {
                Foo foo = new Foo("foo");
                foo.addBar(new Bar("bar1"));
                foo.addBar(new Bar("bar2"));
                foo.addBar(new Bar("bar3"));
                session.save(foo);
            }
        });

        doInTransaction(new Command() {
            public void execute(Session session) {
                Bar bar = (Bar) session.createQuery(
                        "from Bar b where b.text = 'bar2'").
                        uniqueResult();
                bar.setDeleted(true);
                session.update(bar);
            }
        });

        doInTransaction(new Command() {
            public void execute(Session session) {
                session.enableFilter("deleted").
                        setParameter("deleted", Boolean.FALSE);
                Foo foo = (Foo) session.createQuery("from Foo").
                        uniqueResult();
                assertEquals(2, foo.getBars().size());
            }
        });
    }

    private void doInTransaction(Command command) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        command.execute(session);
        tx.commit();
        session.close();
    }
}

interface Command {
    public void execute(Session session);
}

نصائح أخرى

يمكنك أيضًا استخدام عبارة SQL للحفاظ على الأشياء ، باستخدام أين السمة: مثال على ملف تعيين السبات الخاص بك لعلاقة محددة:

<set name="specialConditions" cascade="none" order-by="sortOrder, Text1" 
  where="Discriminator in ( 'SPECIAL-CURF-AGREEMENT' ) and active = 'Y'" 
  sort="unsorted" inverse="false" mutable="true" optimistic-lock="true" 
  embed-xml="true">    
  <key column="parentID" not-null="false" on-delete="noaction" /> 
  <one-to-many class="au.gov.abs.maserati.domain.entity.Condition" not-found="exception" embed-xml="true" /> 
</set>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top