2015-09-12 15 views
5

here gibi bir m: n ilişkilendirme yaşıyorum, bununla ilgili bazı bilgiler AuthorBook öğesinin ilişkili olması dışında. Sanırım, @JoinTable'a ihtiyacım yok ve Author ve Book'un her birine bir bağlantı ve ek bilgilerden oluşan bir class AuthorBook oluşturmalısınız.Açık Hazırda Bekletme birleştirme tablosu

Ben

@Entity 
public class AuthorBook { 
    @Id @ManyToOne Author author; 
    @Id @ManyToOne Book book; 
    @LobOrWhatever AdditionalInformation additionalInformation; 
} 

gibi denedim ve ben (ben artık tam olarak hatırlamıyorum) sorunlarla karşılaştı. Bu yüzden bir @GeneratedId int id ekledim ve başvuruları @NaturalId olarak değiştirdim. Bu, çoğunlukla iyi çalışır, ama eğlenceli, bana Author ve BookSession#byNaturalId geçmek için beni zorlar (beni icar ve varlıkların birlikte getirilmesi gerekir). Ben de

session.byNaturalId(AuthorBook.class) 
    .using("author.id", someAuthorId) 
    .using("book.id", someBookId) 
    .load(); 

çalıştı ama bu "author.id" (doğal id "yazar", ama onun "id" eşit derecede iyi çalışır gibi aslında doğru) hiçbir doğal kimliği olduğunu söyleyip reddedildi.

Web'e baktığımda, herkesin böyle bir tablodaki varlıklar yerine kimlikleri kullanarak buluyorum, bu yüzden imkansız bir şey denediğimi merak ediyorum .... (ya da aptal).

cevap

5

UPD: Gereksiz kaldırıldı @AssociationOverrides. StackOverflowException'un değişikliklerini önlemek için @ManyToOne(fetch = FetchType.LAZY) eklendi.

Son zamanlarda benzer bir sorun yaşadım. Çözümümü @EmbededId ile buldum.

Veritabanımda, Kullanıcı ile Film arasında çoktan çoğa ilişkisi sağlayan bir Tablo Derecelendirmesi vardır; böylece, userId ve movieId yabancı anahtarlardır ve birleşik birincil anahtar oluşturur. Ve bu tablo ayrıca bazı ek bilgiler içerir. İşte

kodum, bunu size yardımcı olacaktır umut:

Film:

@Entity 
@Table(name = "movie") 
public class Movie { 
    @Id 
    @Column(name = "movie_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.movie") 
    private List<Rating> ratings; 
} 

Kullanıcı:

@Entity 
@Table(name = "imdb_user") 

public class User { 
    @Id 
    @Column(name = "imdb_user_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.user") 
    private List<Rating> ratings; 
} 

Değerlendirme: Bu uygular

@Entity 
@Table(name = "rating") 
public class Rating { 
    @EmbeddedId 
    private RatingId primaryKey = new RatingId(); 

    @Column(name = "rating_value") 
    private Integer ratingValue; 
} 

Utility sınıfı R için birleşik kimlik ating:

@Embeddable 
public class RatingId implements Serializable{ 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "movie_id") 
    private Movie movie; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "imdb_user_id") 
    private User user; 

    /*Generated by IDEA*/ 
    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     RatingId ratingId = (RatingId) o; 

     if (movie != null ? !movie.equals(ratingId.movie) : ratingId.movie != null) return false; 
     return !(user != null ? !user.equals(ratingId.user) : ratingId.user != null); 

    } 

    @Override 
    public int hashCode() { 
     int result = movie != null ? movie.hashCode() : 0; 
     result = 31 * result + (user != null ? user.hashCode() : 0); 
     return result; 
    } 
} 
İlgili konular