休眠:@EmbeddedId、继承和@SecondaryTable

Posted

技术标签:

【中文标题】休眠:@EmbeddedId、继承和@SecondaryTable【英文标题】:Hibernate: @EmbeddedId, Inheritance and @SecondaryTable 【发布时间】:2010-11-11 14:27:45 【问题描述】:

我正在使用带有注释的 Hibernate 版本 3.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

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

我无法在字段的@Column 注释中设置表格,因为它在某处被重用的 Field 类。我需要在 SubClass 类中指定它。

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

同样在Hibernate Forum

【问题讨论】:

【参考方案1】:

你应该使用table属性

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

更新

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

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

    


【讨论】:

感谢您的回答。你介意给我另一个建议吗,不幸的是我忘了指定一个部分?我不能简单地将表属性放在@Column 注释中,因为它在另一个类中被重用。再次感谢

以上是关于休眠:@EmbeddedId、继承和@SecondaryTable的主要内容,如果未能解决你的问题,请参考以下文章

使用 @EmbeddedId 映射时出现 Eclipse 错误

@EmbeddedId 和 @Embeddable 中的 @GeneratedValue

如何使用 @EmbeddedId 使用 Spring Data REST 和 ConversionService?

我应该使用哪个注释:@IdClass 或 @EmbeddedId

Embeddable 和 EmbeddedId 之间的 JPA 映射 @ManyToOne

将 @EmbeddedId 与 JpaRepository 一起使用