【问题标题】:Composite foreign key and DDL generation in JPA 2JPA 2 中的复合外键和 DDL 生成
【发布时间】:2012-05-20 16:55:49
【问题描述】:

我正在尝试使用外部复合键创建一个类,并且一切正常,除了 DDL 生成没有按预期创建索引。

我会用一些代码更好地解释;我试图实现的代码部分是功能区奖励:User 可以有很多 Ribbons,Ribbon 可以有很多Users(多对多)。

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 实现。需要考虑的一点是为什么你想知道这一点——当然,修补是件好事——但在这种情况下,我很确定你应该修补(在)JPA 实现中。
  • 感谢您的回答,@esej。 JPA 实现是 Hibernate,数据库是 MySQL。我找到了“解决方案”,请参阅我自己对我的问题的回答。傻我...谢谢!
  • 酷,请接受您自己的答案。 (所以寻找问题要回答的人找不到这个。)
  • 我知道,但我必须等待 2 天才能接受它.. :)

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2011-12-05
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多