0

私は次の状況にあります。記事にはいくつかのタイプのコンテンツ(テキスト、画像、ソースコードなど)が含まれている可能性があります。したがって、私はこの単純なクラス構造を設計しました。

これは、抽象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()andメソッドは、setContent()実際に表示されるコンテンツ(プレーンテキスト、、<img src="..." />...など)を返すため、抽象としてマークされます。

私はTextArticleContentクラスの実装から始めました。このクラスは、コンテンツを文字列に格納するだけです。

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

挿入可能更新可能なものを追加する必要がありました。これは、基本的に、例外のヒントが完全に正しくないことを意味します。

さらに、抽象ArticleContentクラスのInheritanceStrategyを変更する必要がありました。正しい@Inheritance注釈は次のとおりです。

@Inheritance( strategy = InheritanceType.SINGLE_TABLE )

見た目の理由から、TextArticleContent@Tableクラスの注釈を次のように置き換えることができます。

@DiscriminatorValue( "TEXT_ARTICLE_CONTENT" )

これにより、ARTICLE_CONTENTSテーブルの識別子の値がTEXT_ARTICLE_CONTENTに変更されます。

4

1 に答える 1

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();

更新します

挿入可能、更新可能に変更されました。

于 2013-03-24T13:02:17.117 に答える