在Hibernate中使用抽象类进行继承

时间:2013-03-24 12:50:26

标签: hibernate inheritance annotations

我有以下情况,一篇文章可以有几种类型的内容(例如文本,图像,源代码,......)。因此我设计了这个简单的类结构:

这是抽象 ArticleContent 类的来源:

@Entity
@Table( name = "ARTICLE_CONTENTS" )
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public abstract class ArticleContent extends AbstractEntity {

  private Article article;

  @ManyToOne
  @JoinColumn( name = "ARTICLE_ID", nullable = false, updatable = false )
  public Article getArticle() {
    return article;
  }

  public void setArticle( Article article ) {
    this.article = article;
  }

  @Column( name = "CONTENT", columnDefinition = "TEXT", nullable = false )
  public abstract String getContent();

  public abstract void setContent( String content );

}

getContent()setContent()方法被标记为抽象,因为它们将返回实际显示的内容(例如纯文本,<img src="..." />,...)。

我开始实现 TextArticleContent 类。该类只是将内容存储在String:

@Entity
@Table( name = "TEXT_ARTICLE_CONTENTS" )
@AttributeOverrides( { @AttributeOverride( name = "content", column = @Column( name = "CONTENT" ) ) } )
public class TextArticleContent extends ArticleContent {

  private String content;

  @Override
  public String getContent() {
    return content;
  }

  @Override
  public void setContent( String content ) {
    this.content = content;
  }

}

这是我收到的错误输出:

Caused by: org.hibernate.MappingException:
Repeated column in mapping for entity: com.something.model.TextArticleContent column: 
  CONTENT (should be mapped with insert="false" update="false")

虽然错误消息给了我一些建议(should be mapped with insert="false" update="false"),但老实说,因为我刚刚开始使用Hibernate,我不知道如何处理它。

更新:解决方案 此问题的解决方案是我需要更改@Column方法的getContent()注释。正确的注释如下所示:

@Column( name = "CONTENT", columnDefinition = "TEXT", nullable = false, insertable = false, updatable = false )
public abstract String getContent();

我必须添加可插入可更新,这基本上意味着Exception中的提示不完全正确。

此外,我需要更改抽象 ArticleContent 类的InheritanceStrategy。 正确的@Inheritance注释是:

@Inheritance( strategy = InheritanceType.SINGLE_TABLE )

出于美观原因,现在可以替换 TextArticleContent 类中的@Table注释:

@DiscriminatorValue( "TEXT_ARTICLE_CONTENT" )

这会将 ARTICLE_CONTENTS 表中的识别符值更改为 TEXT_ARTICLE_CONTENT

1 个答案:

答案 0 :(得分:1)

尝试更改ArticleContent

    @Column( name = "CONTENT", columnDefinition = "TEXT", nullable = false )
  public abstract String getContent();

        @Column( name = "CONTENT", columnDefinition = "TEXT", nullable = false,
insertable = false, updatable = false )
      public abstract String getContent();

<强>更新

已更改为可插入,可更新。