2010-11-11 3 views
3

Я использую Hibernate версии 3.3.2.GA с аннотациями.Hibernate: @EmbeddedId, Inheritance и @SecondaryTable

меня есть наследование между двумя классами, бывшее:

@Entity 
@Table(name = "SUPER_CLASS") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="DISCR_TYPE", 
    discriminatorType= DiscriminatorType.STRING 
) 
@org.hibernate.annotations.Entity(mutable = false) 
public class SuperClass { } 

Подклассом отображается со вторичной таблицей:

@Entity 
@DiscriminatorValue("VALUE") 
@org.hibernate.annotations.Entity(mutable = false) 
@SecondaryTable(name = "V_SECONDARY_TABLE", 
     pkJoinColumns = @PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")) 
public class SubClass extends SuperClass { 
@Embedded 
    public Field getField() { 
     return getField; 
    } 
} 

В случае, если поле состоит из двух различных полого

@Embeddable 
public class Field { 
@Column("FIELD_1") String field1 
@Column("FIELD_2") String field2 
} 

Теперь, когда я создаю запрос на SubClass, поля FIELD_1 и FIELD_2 просматриваются на Su perClass, даже если они определены в подклассе.

Я не могу установить таблицу в аннотации @Column в поле, потому что класс Field, который он где-то повторно использовал. Мне нужно указать его в классе SubClass.

Как указать, что поле должно быть просмотрено во вторичной таблице?

Также на Hibernate Forum

ответ

5

Вы должны использовать таблицу атрибут

@Column("FIELD_1", table="V_SECONDARY_TABLE") 

UPDATE

Когда встраиваемая колонка используется более чем один объект, вы должны использовать @AttributeOverride если вам нужно повторно отобразить только один столбец или @AttributeOverrides, если более одного столбца

@Entity 
@SecondaryTable(name="OTHER_PERSON") 
@AttributeOverride(name="address.street", [email protected](name="STREET", table="OTHER_PERSON")) 
public class Person { 

    private Address address; 

    @Id 
    @GeneratedValue 
    public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = id; } 

    @Embedded 
    public Address getAddress() { return address; } 
    public void setAddress(Address address) { this.address = address; } 

    @Embeddable 
    public static class Address implements Serializable { 

     private String address; 

     public String getStreet() { return street; } 
     public void setStreet(String street) { this.street = street; } 

    } 

} 
+0

Благодарим вас за ответ. Не могли бы вы дать мне другое предложение, к сожалению, я забыл указать одну часть? Я не могу просто поместить атрибут table в аннотацию @Column, поскольку он повторно используется в другом классе. Еще раз спасибо –

+0

@volothamp См. ** ОБНОВЛЕНИЕ ** –