Сопоставление составного ключа с увеличенным столбцом в Hibernate - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть таблица PROPERTY, первичный ключ которой определен как (REF_1_ID, PROPERTY_ID, PROPERTY_IDX), где PROPERTY_IDX варьируется от 0 до n для тех же значений (REF_1_ID, PROPERTY_ID).

Я бы хотел оставить его в Hibernate для управления значением PROPERTY_IDX, чтобы я мог установить его на null для новых объектов и заполнить его при сохранении.

Чтосамый простой способ достичь этого?

1 Ответ

1 голос
/ 14 сентября 2010

Для тех же значений (REF_1_ID, PROPERTY_ID)

Вы можете узнать, сколько объектов недвижимости с тем же (REF_1_ID, PROPERTY_ID) у вас есть

Integer indexValue = (Integer)

session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId")
       .setParameter("referenceId", referenceId)
       .setParameter("propertyId", propertyId)
       .iterate()
       .next();

Затем вы устанавливаете

propertyId.setIndexValue(indexValue);

Вы можете использовать HibernateInterceptor для достижения этой функциональности (метод onSave). Имейте в виду проблемы параллелизма при работе с этим сценарием

Или заключить в капсулу следующим образом

@IdClass(PropertyId.class)
public class Property {

    private Integer referenceId;
    private Integer propertyId;
    private Integer indexValue;

    /**
      * You can use some repository instead
      *
      * setUp by using Either constructor Or setter injection
      */
    private Session session;

    public Property() {}
    public Property(Session session) {
        this.session = session;
    }

    @Id 
    public Integer getIndexValue() {
        if(indexValue != null)
            return indexValue;

        return (Integer)

            session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId")
                   .setParameter("referenceId", referenceId)
                   .setParameter("propertyId", propertyId)
                   .iterate()
                   .next();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...