Отображение гибернации для сложных объединений

У меня есть устаревший код, который я пытаюсь сопоставить с новым кодом.

OLD_PERSON
pid
sid
name
age

NEW_PERSON
pid
sid
fid
age

RESOLVE_PERSON
pid
fid
status

Класс Java

domain.Person {
 ID _id;
 String _name;
 Integer _age;
}

В устаревшем мире была только одна таблица: OLD_TABLE. Отображение гибернации было простым, всего один класс и его столбцы. В новом мире я должен использовать указанные выше 3 таблицы и создать одну сущность, имя которой происходит от OLD_PERSON, а возраст - от NEW_PERSON. Итак, в основном запрос SQL:

select op.name as name, np.age as age
from OLD_PERSON op
INNER JOIN RESOLVE_PERSON rp
on rp.pid = op.pid
INNER JOIN NEW_PERSON np 
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid
where rp.status = 'CURRENT'

После исследования / поиска в Google я обнаружил, что могу использовать «Вторичные таблицы», которые эквивалентны «таблице JOIN» в hibernate xml. Примечание. Я не могу использовать аннотации, так как этот код старый, а я все еще нахожусь в режиме hibernate3.5.6.

Поэтому я добавил таблицу соединений в свой файл сопоставления:

<class name="domain.Person" table="OLD_PERSON">
        <composite-id name="_id" class="Id">
            <key-property access="property" name="key1" type="long" column="pid" />
            <key-property access="property" name="key2" type="int" column="sid" />

            <generator class="assigned" />
        </composite-id>

        <property name="_Name" type="String" column="name" />

        <join table="NEW_PERSON" fetch="join" inverse="false">
          <key>
            <column name="pid" />
            <column name="sid" />
          </key>
            <property name="_age" column="age" not-null="true" />
        </join>
</class>

Но для соединения с таблицей NEW_PERSON требуется внутреннее соединение с таблицей RESOLVE_PERSON. Я пробовал использовать подвыбор, но это не тот вариант. Я не могу подключить здесь формулу.

Есть какие-нибудь указания на то, как этого можно достичь? По сути, я прошу, как применить проверку критериев / ограничений к JOIN.


person imgr8    schedule 19.03.2017    source источник


Ответы (1)


У меня была ситуация, похожая на вашу проблему. Я сопоставил третью таблицу с сущностью и использую DAO для этой сущности, чтобы получить что-то по ее свойству.

Вот код (поскольку я использовал аннотацию, поэтому вы не можете использовать ее напрямую, но, надеюсь, это даст вам некоторое вдохновение),

@Entity
@Table(name = "resolve_person")
public class ResolvePerson implements java.io.Serializable {
    private OldPerson old;
    private NewPerson new;

    ...

    @ManyToOne // you may change it to other relationships
    @JoinColumn(name = "pid", nullable = false)
    public OldPerson getOldPerson () {
        return this.old;
    }

    public void setOldPerson (OldPerson old) {
        this.old = old;
    }

    @Id
    @GeneratedValue(generator = "idGenerator")
    @GenericGenerator(name = "idGenerator", strategy = "foreign",
            parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "fid") })
    @Column(name = "fid", nullable = false, unique = true)
    public NewPerson getNewPerson () {
        return this.New;
    }

    public void setNewPerson (NewPerson new) {
        this.new = new;
    }
}

ДАО вполне нормально,

public List findByProperty(String propertyName, Object value) {
        log.debug("finding ResolvePerson instance with property: "
                + propertyName + ", value: " + value);
        try {
            String queryString = "from ResolvePerson as model where model."
                    + propertyName + "= ?";
            Query queryObject = getSession().createQuery(queryString);
            queryObject.setParameter(0, value);
            return queryObject.list();
        } catch (RuntimeException re) {
            log.error("find by property name failed", re);
            throw re;
        }
    }

Теперь вы можете делать запросы, установив для свойства «статус» значение «текущий».

person Simon    schedule 30.03.2017