Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate, MappedSuperclass и исключение поля


Автор: afon 3.3.2010, 20:03
Как исключить поле из маппинга в классе наследнике?

Ситуация: 
Класс Card, в котором есть ссылка на класс TaxPolicy (двустороння связь). От Card наследуется некий CardRecord, который просто содержит те же поля, что и Card и добавляет одно свое поле. Нужно, чтобы класс CardRecord не подтягивал ссылку на taxPolicy из своего родителя. Можно ли так сделать?

Код
Код

@Entity
@Table(name = "Card_tbl")
@MappedSuperclass
public class Card extends BaseEntity {

    protected String serial;
    
    protected Integer pin;

    @ManyToOne
    @JoinColumn(name = "taxPolicyId")
    @ForeignKey(name = "fk_card_to_taxpolicy")
    private TaxPolicy taxPolicy;

}


Код

@Entity
@Table(name = "TaxPolicy_tbl")
public class TaxPolicy extends BaseEntity {

    private String name;
    
    @OneToMany(mappedBy = "taxPolicy")
    private Set<Card> cards;
}


Код


@Entity
@Table(name = "CardRecord_tbl")
public class CardRecord extends Card { 

    public CardRecord(Card c) {
        this.originalCardId = c.getId();
        this.pin = c.getPin();
        this.serial = c.getSerial();
    }
    
    private Long originalCardId;
}


Автор: MaxPayneC 3.3.2010, 20:23
Попробуйте объявить метод getTaxPolicy() и пометить его как @Transient. Или поле, если вы расставляли аннотации у полей.

Автор: afon 3.3.2010, 20:57
Пробовал, не получается.
Самый простой пусть - описать свои идентичные поля у наследника Карты CardRecord-а и не парится smile Благо, полей всего несколько. 
Просто хочется сделать в духе хибернейта.

Автор: MaxPayneC 3.3.2010, 21:00
Да, пожалуй то что вы написали - единственный возможный вариант, если транзиент не катит :(

Автор: garbuz 3.3.2010, 23:30
А LAZY не покатит?

Автор: afon 4.3.2010, 01:02
Пардон. Не понял. При чем тут lazy? Это же просто стратегия вытягивание объектов по ссылке 1-*

При таком коде, как я показал, хибернейт валится еще на старте при валидации/создании таблиц. Лейзи тут не поможет.

Мне нужно что-то вроде @AttributeOverride, только в AttributeOverride можно лишь переименовать поля и их маппинг на колонки. А вот так чтобы исключить колонку из маппинга в принципе, - нельзя. 
Думал, может кто из уважаемого сообщества знает нужную аннотацию. 
Прихожу к выводу, что (как минимум в hibernate) так сделать нельзя.

Автор: Restavrator 4.3.2010, 02:07

А что мешает сделать некий BaseCard в котором будут все поля кроме taxPolicy.
Card и CardRecord унаследовать от BaseCard с добавлением соответствующих полей.

Автор: afon 4.3.2010, 17:56
Ничего не мешает. Просто не подумал. 
Спасибо, отличное простое решение :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)