【发布时间】: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