gpt4 book ai didi

java - JPA 2 中的复合外键和 DDL 生成

转载 作者:行者123 更新时间:2023-12-01 15:22:38 24 4
gpt4 key购买 nike

我正在尝试创建一个带有外部复合键的类,一切正常,只是 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 有索引,但未链接到 ribbonid
  • ribbon_level 根本没有索引
  • user_id 正确,有一个链接到 user 的索引。id

我知道应该在生产中禁用 DDL 生成,我只是想知道为什么它的行为不符合预期。

谢谢!

最佳答案

我刚刚意识到 JPA 确实在两列(ribbon_idribbon_level)上创建了复合索引,并且工作正常。我很困惑,因为 phpMyAdmin 在涉及复合索引时无法正确显示关系...

关于java - JPA 2 中的复合外键和 DDL 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com