2012-10-28 2 views
0

나는 영화관 지주를 시뮬레이트하는 Java 응용 프로그램을 구현 중입니다. 엔티티 중 하나는 Film이며,이 엔티티는 많은 수의 Genres을 가질 수 있지만, 분명히 제한된 수의 수는 Genres입니다. 나는 이것을 Hibernate에서 어떻게 구현해야하는지 확신하지 못한다.한쪽에 제한된 옵션으로 다 대다 매핑

먼저 enum 클래스 Genre을 만들고 Film 엔티티에 Set<Genre> genres = new HashSet<>(); 특성을 부여했습니다.

이 문제는 Hibernate에 의해 생성 된 테이블 film_genres 전화에 Genre가 데이터베이스에서 BLOB로 저장됩니다 나는 특정 Genre의 모든 영화를 요청 할 수 없을 것입니다. (최소한 내 제한된 Hibernate 경험에서).

는 다음 나는 Genre 클래스는 다음과 같습니다 어디 가능한 모든 Genres로 시작시 데이터베이스를 채울 수 있다고 생각 :

public class Genre { 
    private Integer id; 
    private String name; 

    private Genre() {} 

    public Genre(String name) { 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    private void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    private void setName(String name) { 
     this.name= name; 
    } 
} 

아주 기본 클래스입니다. 하지만 지금은 할 수 없어, 나는 FilmGenre를 추가 할 말 :이 장르 드라마의 각 영화에 대한 새로운 Genre 객체를 생성하는 것처럼

Film film = new Film("The Terminal"); 
film.addGenre(new Genre("Drama")); 

가보고. "Drama"값을 갖는 Genre 개체를 가져 와서 해당 개체를 추가하려면 먼저 데이터베이스로 이동해야합니까?

그 수행해야 무슨 경우에, 난 여전히 같은 열거를 사용하고 싶습니다 :

public enum GenreEnum { 
    DRAMA("Drama"), 
    ADVENTURE("Adventure"), 
    ACTION("Action"), 
    ... 

    private String value; 

    GenreEnum(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 
} 
그 이유는 내가 들어가는 초기 값의 맞춤법을 완벽하게 제어 할 수 있다는 것입니다

데이터베이스합니다 (미리 채우기) 및 열거 형의 값, 그래서 나는 지금이 작업을 수행 할 수 있습니다 :

Film film = new Film("The Terminal"); 
film.addGenre(GenreEnum.DRAMA); 

그리고 다음 addGenre 방법에 내가 할 수있는을 :

public void addGenre(GenreEnum ge) { 
    Query query = session.createQuery("from Genre g where g.name = " + ge.getValue()); 
    Genre genre = (Genre)query.list().get(0); 
    this.genres.add(genre); 
} 

트랜잭션 코드를 모델에 넣지는 않겠지 만 단순화를 위해 거기에 넣었습니다. 나는 또한 연결의 사용이 안전하지 않다는 것을 알고 있습니다.

괜찮은 해결책인가요? 아니면 이것을 달성하기 위해 더 간단한 것을 놓치고 있습니까?

답변

0

중 하나를 전체로 장르를 만드는 기본 키

public enum Genre { 
    DRAMA("Drama"), 
    ADVENTURE("Adventure"), 
    ACTION("Action"), 
    ... 

    private String value; 

    GenreEnum(String value) { 
     this.value = value; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

<compositeId> 
    <key-property name="value" /> 
</compositeId> 


Film film = new Film("The Terminal"); 
film.addGenre(session.load<GenreEnum>(Genre.DRAMA)); 

// or 
for(Genre g : GetAllGenre) 
    session.attach(g); 

Film film = new Film("The Terminal"); 
film.addGenre(Genre.DRAMA); 

또는 열거에 고정 이드 소개

public enum Genre { 
    DRAMA(1, "Drama"), 
    ADVENTURE(2, "Adventure"), 
    ACTION(3, "Action"), 
    ... 

    private int id; 
    private String value; 

    GenreEnum(int id, String value) { 
     this.id = id; 
     this.value = value; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

Film film = new Film("The Terminal"); 
film.addGenre(session.load<GenreEnum>(Genre.DRAMA.getId())); 
관련 문제