外部複合キーを使用してクラスを作成しようとしていますが、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
インデックスがありますが、にリンクされていませんribbon
。id
ribbon_level
インデックスがまったくありませんuser_id
は正しく、にリンクされたインデックスがありますuser
。id
DDL生成を本番環境で無効にする必要があることはわかっていますが、なぜ期待どおりに動作しないのか疑問に思っています。
ありがとうございました!