我正在尝试创建一个带有外部复合键的类,一切正常,只是 DDL 生成没有按预期创建索引。
我会用一些代码更好地解释;我试图实现的代码部分是功能区奖励:一个User
可以有许多Ribbon
,一个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;
// ...
}
这非常简单,一切都运行良好。唯一的问题是我注意到自动 DDL 生成没有在 user_has_ribbon
表中创建索引:
ribbon_id
有索引,但未链接到ribbon
。id
ribbon_level
根本没有索引user_id
正确,有一个链接到user
的索引。id
我知道应该在生产中禁用 DDL 生成,我只是想知道为什么它的行为不符合预期。
谢谢!
最佳答案
我刚刚意识到 JPA 确实在两列(ribbon_id
和 ribbon_level
)上创建了复合索引,并且工作正常。我很困惑,因为 phpMyAdmin 在涉及复合索引时无法正确显示关系...
关于java - JPA 2 中的复合外键和 DDL 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675358/