代码之家  ›  专栏  ›  技术社区  ›  Luca Molteni

休眠:@EmbeddedId,继承和@SecondaryTable

  •  3
  • Luca Molteni  · 技术社区  · 14 年前

    我正在使用带有注释的Hibernate3.3.2.GA版本。

    我继承了两个阶级,前者:

    @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
    }
    

    现在,当我在子类上创建一个查询时,FIELD_1和FIELD_2字段将在超类上搜索,即使它们是在子类中定义的。

    我不能在字段中的@Column注释中设置表,因为它在某个地方被重用。我需要在子类中指定它。

    如何指定在辅助表中搜索该字段?

    也在 Hibernate Forum

    1 回复  |  直到 14 年前
        1
  •  5
  •   Arthur Ronald    14 年前

    你应该用 桌子 属性

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

    更新

    当一个可嵌入的列被多个实体使用时,如果只需要重新映射一个列,则应使用@AttributeOverride;如果有多个列,则应使用@AttributeOverride

    @Entity
    @SecondaryTable(name="OTHER_PERSON")
    @AttributeOverride(name="address.street", column=@Column(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; }
    
        }
    
    }