Могу ли я указать отношения гибернации с фильтром? - PullRequest
2 голосов
/ 13 марта 2009

У меня есть foo, который имеет отношение ко многим барам.

Когда я удаляю столбики в моей системе, я хочу сохранить их в базе данных по какой-то сумасшедшей деловой причине, поэтому я просто устанавливаю удаленное поле в true.

Могу ли я указать в своем отображении спящего режима, что я хочу, чтобы моя коллекция содержала элементы только в том случае, если это поле имеет значение false?

Ответы [ 2 ]

3 голосов
/ 13 марта 2009

Вы также можете использовать оператор 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>
2 голосов
/ 13 марта 2009

Hibernate предоставляет фильтры для достижения этой цели.

Пример бобов:

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
}

Примеры отображений Примечание: элемент 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...