2012-05-20 3 views
0

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 생성을 프로덕션 환경에서 사용하지 않아야한다는 것을 알고 있습니다. 왜 예상대로 작동하지 않는지 궁금합니다.

감사합니다.

+0

사용하는 JPA 구현에 따라 작동 방식이 다릅니다. 고려해야 할 것은 이것이 궁금해하는 이유입니다. 물론 팅커를 사용하는 것이 좋습니다. 그러나이 경우 JPA 구현을 수정해야합니다. – esej

+0

답변 해 주셔서 감사합니다. @esej. JPA 구현은 Hibernate이고 데이터베이스는 MySQL이다. 나는 "해결책"을 찾았고 내 질문에 대한 내 대답을 보았습니다. 어리석은 나 ... 고마워! – satoshi

+0

멋진 답변이므로 직접 답변 해주세요. (그래서 사람들은 대답 할 질문을 찾지 못한다.) – esej

답변

1

난 그냥 JPA 는 두 개의 열 (ribbon_idribbon_level)과 잘 일하고에 복합 인덱스를 생성했다는 것을 깨달았다. phpMyAdmin이 복합 요소에 관한 것이기 때문에 phpMyAdmin이 관계를 올바르게 표시하지 않기 때문에 혼란스러워졌습니다 ...