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