2010-11-11 90 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