0

外部複合キーを使用してクラスを作成しようとしていますが、DDL生成で期待どおりにインデックスが作成されないことを除いて、すべてが正常に機能します。

いくつかのコードでよりよく説明します。私が実装しようとしているコードの一部は、リボンの授与です。aUserは多くRibbonのsを持つRibbonことができ、aは多くUserのs(多対多)を持つことができます。

Ribbonクラス:

@Entity
@Table(name = "ribbon")
public class Ribbon
{
    @AttributeOverrides({
            @AttributeOverride(
                    name = "id",
                    column = @Column(name = "id", nullable = false, length = 4)
            ),
            @AttributeOverride(
                    name = "level",
                    column = @Column(name = "level", nullable = false)
            )
    })
    @EmbeddedId
    RibbonId id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "ribbon")
    private Set<UserHasRibbon> userHasRibbonSet;

    // ...
}

RibbonIdクラス:

@Embeddable
public class RibbonId implements Serializable
{
    public int id;

    @Enumerated(EnumType.STRING)
    public UserLevel level;

    @Override
    public boolean equals(Object o)
    {
        // ...
    }

    @Override
    public int hashCode()
    {
        // ...
    }
}

UserHasRibbonクラス:

@Entity
@Table(name = "user_has_ribbon")
public class UserHasRibbon
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false, length = 16)
    private int id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @ManyToOne(optional = false)
    @JoinColumns({
            @JoinColumn(name="ribbon_id", referencedColumnName="id", nullable = false),
            @JoinColumn(name="ribbon_level", referencedColumnName="level", nullable = false)
    })
    private Ribbon ribbon;

    @Column(name = "earned_date", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date earnedDate;

    // ...
}

それはかなり簡単で、すべてが完璧に機能しています。user_has_ribbon唯一の問題は、自動DDL生成がテーブルにインデックスを作成しなかったことに気づいたことです。

  • ribbon_idインデックスがありますが、にリンクされていませんribbonid
  • ribbon_levelインデックスがまったくありません
  • user_idは正しく、にリンクされたインデックスがありますuserid

DDL生成を本番環境で無効にする必要があることはわかっていますが、なぜ期待どおりに動作しないのか疑問に思っています。

ありがとうございました!

4

1 に答える 1

1

JPAがribbon_id2 つの列 (および)に複合インデックスを作成し、正常に機能していることに気付きましたribbon_level。複合インデックスの場合、phpMyAdmin が関係を正しく表示しないため、混乱しました...

于 2012-05-20T18:23:16.890 に答える