Hibernate继承自另一个项目的类

时间:2012-08-13 08:24:14

标签: hibernate inheritance annotations

我从另一个项目中包装以下类。它不应该使用Hibernate注释进行注释:

public class Response
{
    private String access;

    ...

    public String getAccess()
    {
        return this.access;
    }

    public void setAccess(String access)
    {
        this.access = access;
    }

    ...
}

这是我当前项目中的“包装类”(用于持久性)。 但是,Response超类的属性未映射。 (例如Access) (仅映射添加的属性entry_id。)

@Entity
@Table(name = "ruleEngineResponse")
public class RuleEngineResponse extends Response
{
    @Id
    @Column(name = "entry_id")
    private Long entry_id = -1L;

    public void setId(Long entry_id)
    {
        this.entry_id = entry_id;
    }

    public Long getId()
    {
        return this.entry_id;
    }

    // Problem: this property is not mapped
    @Column(name = "access")
    @Override
    public String getAccess()
    {
        return super.getAccess();
    }

    ...
}

我如何配置RuleEngineResponse来映射Response超类的属性而不触及Response超类?

2 个答案:

答案 0 :(得分:1)

此问题的典型解决方案是使用Response注释@MappedSuperclass。如果你不能这样做,你应该能够在orm.xml中声明相同的内容,如下所示:

<mapped-superclass class = "Response" />

请参阅Chapter 3. Overriding metadata through XML

答案 1 :(得分:1)

它不起作用,因为一些注释被放置到字段,而其他注释被放置到属性。在JPA 2.0规范中,用以下词语告知:

  

访问类型为的实体层次结构中的所有此类   以这种方式违约必须保持一致   对字段或属性的注释,例如单个,   一致的默认访问类型适用于层次结构。

Hibernate的情况是,访问类型最终到 field ,因为@Id注释被放置到字段。因此,getAccess和其他方法中的注释也会被忽略。

如果要保留当前的类层次结构并且不想在RuleEngineResponse中再次定义变量access,则注释应该是方法的位置:

@Entity
@Table(name = "ruleEngineResponse")
public class RuleEngineResponse extends Response {

    private Long entry_id = -1L;

    @Id
    @Column(name = "entry_id")
    public Long getId() {
        return this.entry_id;
    }

    @Column(name = "access")
    @Override
    public String getAccess() {
        return super.getAccess();
    }
    ...
}

如果由于某种原因混合属性和字段访问是首选,可以使用@AccessType注释完成。您还可以考虑使用其他答案中建议的MappedSuperClass,但也必须解决注释放置中的冲突。