2012-08-13 61 views
1

我正在从另一个项目中包装以下类。它不应该注释Hibernate注释:从另一个项目的类继承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超不沾响应超?

回答

1

它不起作用,因为一些注释放置在字段中,而其他注释放置在属性上。在JPA 2.0规范,这是说用下面的话:

所有这些类在实体层级,其访问类型是 默认这种方式必须是在他们对字段或属性,使得 标注位置一致在层次结构中应用一个一致的默认访问类型 。

在休眠的情况下,会发生什么情况是,访问类型最终以,因为@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,但也必须解决注释布局中的冲突。

+0

谢谢,这解决了我的问题。我将定义移到了方法中(并且我没有使用mappedsuperclass标签。) – ndrizza 2012-08-13 11:57:22

1

该问题的典型解决方案是用@MappedSuperclass注释Response。如果你不能做到这一点,你应该能够申报orm.xml同样的事情如下:

<mapped-superclass class = "Response" /> 

Chapter 3. Overriding metadata through XML