2010-11-11 96 views
3

我使用帶註釋的Hibernate 3.3.2.GA。Hibernate:@EmbeddedId,繼承和@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上創建查詢時,在Su上搜索FIELD_1和FIELD_2字段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註釋中,因爲它在另一個類中被重用。再次感謝 – 2010-11-12 09:09:26

+0

@volothamp請參閱**更新** – 2010-11-12 14:15:52