1

我正在包装来自另一个项目的以下类。不应使用 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超类的属性而不触及响应超类?

4

2 回答 2

1

这个问题的典型解决方案是用Response注释@MappedSuperclass。如果你不能这样做,你应该能够在orm.xml如下声明相同的东西:

<mapped-superclass class = "Response" />

请参阅第 3 章。通过 XML 覆盖元数据

于 2012-08-13T09:13:54.613 回答
1

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

以这种方式默认访问类型的实体层次结构中的所有此类类必须在它们在字段或属性上的注释放置方面保持一致,以便在层次结构中应用单个一致的默认访问类型。

在 Hibernate 的情况下发生的情况是访问类型以field结束,因为 @Id注释被放置到 field。因此,方法中的注释getAccess和其他方法也被忽略。

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

@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,但也必须解决注释放置中的冲突。

于 2012-08-13T10:11:36.790 回答