1

継承で Hibernate (4.2.4.Final) を使用するようにプロジェクトをリファクタリングするだけです。しかし、ManyToMany アノテーションに問題がありました。

次のような基本ファイル クラスがあります。

@Entity
@Table(name = "file")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "descriminator", length = 25)
public abstract class File {

    @Id
    @Column(name = "id", unique = true, nullable = false, length = 256)
    private String id;
}

そして、このような特別な継承クラス:

@Entity
@DiscriminatorValue("ISSUE_HISTORY_ATTACHMENT")
@Data
public class IssueHistoryAttachment extends File {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinTable(name = "issue_history_attachment", joinColumns = {
            @JoinColumn(name = "attachment_id", nullable = false, unique = true) }, inverseJoinColumns = {
            @JoinColumn(name = "issue_history_id", nullable = false)})
    private IssueHistory history;

}

この IssueHistoryAttachment クラスは、IssueHistory クラスでも参照されています。

@Entity
@Table(name = "issue_history")
@TableGenerator(name="tg", table="hibernate_sequences",pkColumnName="sequence_name", valueColumnName="sequence_next_hi_value", allocationSize=1)
public class IssueHistory implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "tg")
    @Column(name = "id", unique = true, nullable = false)
    private int id;

// some other fields

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "issue_history_attachment", joinColumns = {
            @JoinColumn(name = "issue_history_id", nullable = false)
        }, inverseJoinColumns = {
            @JoinColumn(name = "attachment_id", nullable = false, unique = true)
    })
    private Set<IssueHistoryAttachment> attachments = new HashSet<IssueHistoryAttachment>();

}

2 つの添付ファイルを含む IssueHistory インスタンスを保存すると、このすべてのフィールドがデータベースに正しく保存されます。

ファイルテーブルに2つの新しいエントリがあり、*issue_history* テーブルに 1 つの新しいエントリがあり、関係テーブル *issue_history_attachment* に 2 つの正しいエントリがあります。

したがって、この時点で、すべての考えは問題ないように見えます。しかし、IssueHistory インスタンスの Values Attachment Set を読み込もうとすると、データベースに格納されているような2 つの要素ではなく、1 つの要素しか含まれません。

これを解決する方法はありますか?

4

2 に答える 2