DDL 생성이 indeces를 예상대로 만들지 않는다는 점을 제외하고는 모두 외래 복합 키를 사용하여 클래스를 만들려고합니다.JPA 2에서 합성 외래 키 및 DDL 생성
일부 코드는 더 잘 설명합니다. 구현하고자하는 코드의 일부는 리본 수여입니다. User
은 많은 Ribbon
을 가질 수 있으며 Ribbon
은 많음 User
(다 대다)을 가질 수 있습니다.
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;
// ...
}
그것은 꽤 간단합니다 및 모든 것이 완벽하게 작동한다.
ribbon_id
인덱스를 가지고 있지만ribbon
에 연결되지 않습니다 유일한 문제는 내가 자동 DDL 세대가user_has_ribbon
테이블의 굴절률들을 작성하지 않은 것으로 나타났습니다 것입니다.id
ribbon_level
가 올바른지 모든
user_id
에서 인덱스가없는,user
에 연결된 인덱스가 있습니다.id
DDL 생성을 프로덕션 환경에서 사용하지 않아야한다는 것을 알고 있습니다. 왜 예상대로 작동하지 않는지 궁금합니다.
감사합니다.
사용하는 JPA 구현에 따라 작동 방식이 다릅니다. 고려해야 할 것은 이것이 궁금해하는 이유입니다. 물론 팅커를 사용하는 것이 좋습니다. 그러나이 경우 JPA 구현을 수정해야합니다. – esej
답변 해 주셔서 감사합니다. @esej. JPA 구현은 Hibernate이고 데이터베이스는 MySQL이다. 나는 "해결책"을 찾았고 내 질문에 대한 내 대답을 보았습니다. 어리석은 나 ... 고마워! – satoshi
멋진 답변이므로 직접 답변 해주세요. (그래서 사람들은 대답 할 질문을 찾지 못한다.) – esej