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

标签 java foreign-keys jpa-2.0 composite-primary-key

我正在尝试创建一个带有外部复合键的类,一切正常,只是 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/

相关文章:

java - 从搜索结果(Java)中计算页数的方法是什么?

mysql - 如何使用 phpmyadmin 添加删除级联和更新限制?

mysql - 无法向现有表添加外键

sql - 可延迟最初在 postgresql 中延迟

java - JPA : removing from a collection 中管理双向关系时出现问题

java - 具有 2 个主键字段的 JPA 表

java - 在Windows 7上启动Java应用程序的最佳方法是什么?

java - 持久化时间戳类型只有日期没有时间

java - 有没有什么方法可以找出Android智能手机的显示变化事件?

java - Hibernate JPA 映射中的问题