2016-05-10 9 views
0

私はClientとMovieという2つのクラスを持っています。私はクライアントの外来キーと本の外字キーを保持するクラスRentedMovieを持っていたいと思います。また、独自のIDも持っています。これまでのところ私のクラスには同じように見える:1つのマッピングクラス内の複数の外部キーHibernate + JPA + Spring

クライアント:

@Entity 
@Table(name="Client") 
public class Client implements Serializable { 

    @Id 
    @Column(name="id", nullable= false) 
    private Integer id; 

    @Column(name="age", nullable = false) 
    private Integer age; 

    @Column(name="numberofrentals", nullable = false) 
    private Integer numberofrentals; 

    @Column(name="name", nullable = false) 
    private String name; 

    @Column(name="address", nullable = false) 
    private String address; 

    public Client() { 
    } 

    public Client(Integer id, Integer age, Integer numberofrentals, String name, String address) { 

     this.id = id; 
     this.age = age; 
     this.numberofrentals = numberofrentals; 
     this.name = name; 
     this.address = address; 
    } 

    public Integer getId() { 

     return id; 
    } 

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

    public Integer getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public Integer getnumberofrentals() { 
     return numberofrentals; 
    } 

    public void setnumberofrentals(int numberofrentals) { 
     this.numberofrentals = numberofrentals; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public String getAddress() { 
     return address; 
    } 

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

     Client client = (Client) o; 

     if (age != client.age) return false; 
     if (numberofrentals != client.numberofrentals) return false; 
     if (!id.equals(client.id)) return false; 
     if (!name.equals(client.name)) return false; 
     return address.equals(client.address); 

    } 

    @Override 
    public int hashCode() { 
     int result = id.hashCode(); 
     result = 31 * result + age; 
     result = 31 * result + numberofrentals; 
     result = 31 * result + name.hashCode(); 
     result = 31 * result + address.hashCode(); 
     return result; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    @Override 
    public String toString() { 
     return "Client{" + 
       "id=" + id + 
       ", age=" + age + 
       ", numberofrentals=" + numberofrentals + 
       ", name='" + name + '\'' + 
       ", address='" + address + '\'' + 
       '}'; 
    } 
} 

映画:

@Entity 
@Table(name="movie") 
public class Movie implements Serializable { 

    @Id 
    @Column(name="id", nullable=false) 
    private Integer id; 

    @Column(name="name", nullable = false) 
    private String name; 

    @Column(name="numberofrentals", nullable=false) 
    private Integer numberofrentals; 

    @Column(name="director", nullable = false) 
    private String director; 

    @Column(name="year", nullable = false) 
    private Integer year; 

    public Movie() { 
    } 

    public Movie(Integer id, String name, Integer numberofrentals, String director, Integer year) { 
     this.id = id; 
     this.name = name; 
     this.numberofrentals = numberofrentals; 
     this.director = director; 
     this.year = year; 
    } 

    public Integer getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

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

    public String getDirector() { 
     return director; 
    } 

    public void setDirector(String director) { 
     this.director = director; 
    } 

    public Integer getYear() { 
     return year; 
    } 

    public void setYear(Integer year) { 
     this.year = year; 
    } 

    public Integer getNumberofrentals() { 
     return numberofrentals; 
    } 

    public void setNumberofrentals(Integer numberofrentals) { 
     this.numberofrentals = numberofrentals; 
    } 

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

     Movie movie = (Movie) o; 

     if (!id.equals(movie.id)) return false; 
     if (!name.equals(movie.name)) return false; 
     if (!numberofrentals.equals(movie.numberofrentals)) return false; 
     if (!director.equals(movie.director)) return false; 
     return year.equals(movie.year); 

    } 

    @Override 
    public int hashCode() { 
     int result = id.hashCode(); 
     result = 31 * result + name.hashCode(); 
     result = 31 * result + numberofrentals.hashCode(); 
     result = 31 * result + director.hashCode(); 
     result = 31 * result + year.hashCode(); 
     return result; 
    } 

    @Override 
    public String toString() { 
     return "Movie{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", numberofrentals=" + numberofrentals + 
       ", director='" + director + '\'' + 
       ", year=" + year + 
       '}'; 
    } 
} 

そして今、正常jsutで借りクラス:何

@Entity 
@Table(name="rented") 
public class Rented implements Serializable { 
    @Id 
    @Column(name="id", nullable= false) 
    private Integer id; 

    @Column(name="movieID", nullable = false) 
    private Integer movieID; 

    @Column(name="clientID", nullable = false) 
    private Integer clientID; 

    public Rented(Integer id, Integer movieID, Integer clientID) { 
     this.id = id; 
     this.movieID = movieID; 
     this.clientID = clientID; 
    } 

    public Rented() { 
    } 

    public Integer getId() { 
     return id; 
    } 

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

    public Integer getMovieID() { 
     return movieID; 
    } 

    public void setMovieID(Integer movieID) { 
     this.movieID = movieID; 
    } 

    public Integer getClientID() { 
     return clientID; 
    } 

    public void setClientID(Integer clientID) { 
     this.clientID = clientID; 
    } 

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

     Rented rented = (Rented) o; 

     if (!id.equals(rented.id)) return false; 
     if (!movieID.equals(rented.movieID)) return false; 
     return clientID.equals(rented.clientID); 

    } 

    @Override 
    public int hashCode() { 
     int result = id.hashCode(); 
     result = 31 * result + movieID.hashCode(); 
     result = 31 * result + clientID.hashCode(); 
     return result; 
    } 

    @Override 
    public String toString() { 
     return "Rented{" + 
       "id=" + id + 
       ", movieID=" + movieID + 
       ", clientID=" + clientID + 
       '}'; 
    } 
} 

私は本当に変更する必要がありますか?私はレンタルクラスに映画とクライアントを提供する必要がありますか?クライアントと本の間には、1対1の関係があります。書籍は一度だけ借りることができ、クライアントは複数の書籍を借りることができます。リストをどこかに保管しなければならないのですか?あるいは、賃貸されたクラスはどのように見えるのでしょうか。

+0

? –

+0

嫌いですか?どういう意味ですか? – Mocktheduck

+0

_クライアントとムービーと呼ばれる2つのクラスが嫌いです –

答えて

0

まず、RentedクラスのclientIdをprivate client Clientに変更する必要があります。 次に、このフィールドに注釈@ManyToOneを追加する必要があります。次に、movieIdフィールドと同じことをします。 もちろん、コンストラクタ、ゲッタ、セッタを変更する必要があります。

+0

確かにそれで十分でしょうか?他の2人は何も変わらない? – Mocktheduck

+0

MovieからRentedインスタンスのリストへのアクセスが必要な場合 - > yesですが、fronにアクセスする必要がある場合はインスタンスをMovieおよびクライアントにレンタルするだけで十分です。より多くの情報が必要な場合は、休止状態での単方向および双方向関係について読むことができます。 – krynio

0

マッピングは次のようになります(追加のフィールドは省略されています)。常にオブジェクトとエンティティフィールドの観点から考える。

@Entity 
@Table(name="rental") 
public class Rental implements Serializable { 

    @Id 
    @Column(name="id", nullable= false) 
    private Integer id; 

    //movie associated with this rental 
    @ManyToOne 
    @JoinColumn(name="movieID", nullable = false) 
    private Movie movie; 

    //client associated with this rental 
    @ManyToOne 
    @JoinColumn(name="clientID", nullable = false) 
    private Client client; 
} 

@Entity 
@Table(name="movie") 
public class Movie implements Serializable { 

    //collection of rentals for this movie 
    @OneToMany(mappedBy = "movie") 
    private Set<Rental> rentals; 
} 

@Entity 
@Table(name="client") 
public class Client implements Serializable { 

    //collection of rentals for this client 
    @OneToMany(mappedBy = "client") 
    private Set<Rental> rentals; 
} 

これは、ここで詳細を読むことができ、基本的な双方向の1対多のマッピングです:あなたはこれらのクラスを嫌い、なぜ

https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_relationship_and_inverse_ManyToOne_annotations

+0

私のクラスはレンタルセットを保持しています...実際にそれらのリストに追加する機能を必要としますか? – Mocktheduck

+0

はい。レンタル方法の追加/削除を作成し、コレクションを直接変更することはできません。メモリ内モデルの整合性を保つことが重要です。たとえば、http://stackoverflow.com/a/26220097/1356423を参照してください。 –

関連する問題