2017-01-21 7 views
1

2つのクラス(Chapter &カメラ)間のManyToOne関係が必要です。章オブジェクトには、多くのカメラオブジェクトが含まれています。Spring OneToMany複合キーを持つ別のキーとの複合キー

問題は私の親クラス(章)がすでに複合キーを持っていることです。

章複合キー:

@Embeddable 
public class ChapterKey implements Serializable { 

@Column(name = "Chapter_ID", nullable = false) 
private int chapterID; 

@Column(name = "Operation_FK", nullable = false) 
private int operationFK; 
} 

章クラス:

@Entity 
public class Chapter implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private ChapterKey chapterKey; 

    @Column(name="Chapter_Name") 
    private String chapterName; 

    @Column(name="Chapter_Description") 
    private String chapterDescription; 

    @Column(name="Chapter_View_Range") 
    private int chapterViewRangeInterval; 

    @Column(name="Chapter_Video_Length") 
    private int chapterVideoLength; 
} 

カメラキー:

@Embeddable 
public class CameraKey implements Serializable { 

    @Column(name = "Camera_ID", nullable = false) 
    private int cameraID; 

    @Column(name = "Chapter_FK", nullable = false) 
    private int chapterFK; 

    @Column(name = "Operation_FK", nullable = false) 
    private int operationFK; 
} 

Cameraクラス:

@Entity 
public class Camera implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private CameraKey cameraKey; 

    @Column(name="Camera_Description") 
    private String cameraDescription; 

    @Column(name="Camera_Usage") 
    private int cameraUsage; 

    @Column(name="Video_URL") 
    private String videoURL; 
} 

私の質問は、これらの2つのクラス間でOneToMany関係を作るにはどうすればいいですか?

答えて

0

これはpk(camera_id) & pk(chapter_id,operation_fk)ため

enter image description here

問題は、この章のクラスであるERです。

@Entity 
public class Camera implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "camera_id", nullable = false) 
    private Integer cameraId; 

    @Basic(optional = false) 
    @Column(name = "camera_description", nullable = false, length = 12) 
    private String cameraDescription; 

    @Basic(optional = false) 
    @Column(name = "camera_usage", nullable = false) 
    private int cameraUsage; 

    @Basic(optional = false) 
    @Column(name = "video_url", nullable = false) 
    private int videoUrl; 

    @JoinColumn(name = "chapter_fk", referencedColumnName = "chapter_id", nullable = false) 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    private Chapter chapterFk; 

    @JoinColumn(name = "operation_fk", referencedColumnName = "operation_fk", nullable = false) 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    private Chapter operationFk; 

} 

これはチャプタークラスの主キーを定義するChapterPK.classです。複合プライマリキーを持っています。

@Embeddable 
public class ChapterPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name = "chapter_id", nullable = false) 
    private int chapterId; 

    @Basic(optional = false) 
    @Column(name = "operation_fk", nullable = false) 
    private int operationFk; 

} 

は最終的に私は両方の章とカメラのクラスに2つの結合方法を使用し、ここで

@Entity 
public class Chapter implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected ChapterPK chapterPK; 
    @Basic(optional = false) 

    @Column(name = "chapter_name", nullable = false, length = 12) 
    private String chapterName; 

    @Basic(optional = false) 
    @Column(name = "chapter_description", nullable = false, length = 12) 
    private String chapterDescription; 

    @Basic(optional = false) 
    @Column(name = "chapter_Vvew_range", nullable = false) 
    private int chapterVvewrange; 

    @Basic(optional = false) 
    @Column(name = "chapter_video_length", nullable = false) 
    private int chapterVideoLength; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "chapterFk", fetch = FetchType.EAGER) 
    private Collection<Camera> cameraCollection; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "operationFk", fetch = FetchType.EAGER) 
    private Collection<Camera> cameraCollection1; 

} 

をcamera.class。複合プライマリキーを使用している場合追加の組み込み主キーオブジェクトを管理する必要があります。

+0

私のコードが間違っています。 getterとsetterをコードに追加してチェックしてください。 – wthamira

+0

これはNetbeansから生成されたコードです。 ERがOKであれば、答えは100%正しい。 – wthamira

+0

ありがとう、あなたの答えはまさに探していたものではありませんが、あなたは正しい方向に私を押し込んでくれました。いくつかの調整を加えれば効果がありました! –

0

ためには、以下の通りですチャプター側pk(Chapter_ID, Operation_FK)とカメラ側pk(camera_id,chapter_fk,operation_fk)

ERためこの回答。

enter image description here

Chapter.class Camera.class

@Entity 
public class Camera implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected CameraPK cameraPK; 

    @Basic(optional = false) 
    @Column(name = "camera_description", nullable = false, length = 12) 
    private String cameraDescription; 

    @Basic(optional = false) 
    @Column(name = "camera_usage", nullable = false) 
    private int cameraUsage; 

    @Basic(optional = false) 
    @Column(name = "video_url", nullable = false) 
    private int videoUrl; 

    @JoinColumn(name = "chapter_fk", referencedColumnName = "chapter_id", nullable = false, insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Chapter chapter; 

    @JoinColumn(name = "operation_fk", referencedColumnName = "operation_fk", nullable = false, insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Chapter chapter1; 



} 

CameraPK.class

@Entity 
public class Chapter implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected ChapterPK chapterPK; 
    @Basic(optional = false) 
    @Column(name = "chapter_name", nullable = false, length = 12) 
    private String chapterName; 
    @Basic(optional = false) 
    @Column(name = "chapter_description", nullable = false, length = 12) 
    private String chapterDescription; 
    @Basic(optional = false) 
    @Column(name = "chapter_Vvew_range", nullable = false) 
    private int chapterVvewrange; 
    @Basic(optional = false) 
    @Column(name = "chapter_video_length", nullable = false) 
    private int chapterVideoLength; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "chapter") 
    private Collection<Camera> cameraCollection; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "chapter1") 
    private Collection<Camera> cameraCollection1; 


} 

ChapterPK.class

@Embeddable 
public class ChapterPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name = "chapter_id", nullable = false) 
    private int chapterId; 
    @Basic(optional = false) 
    @Column(name = "operation_fk", nullable = false) 
    private int operationFk; 



} 

ある

@Embeddable 
public class CameraPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name = "camera_id", nullable = false) 
    private int cameraId; 
    @Basic(optional = false) 
    @Column(name = "chapter_fk", nullable = false) 
    private int chapterFk; 
    @Basic(optional = false) 
    @Column(name = "operation_fk", nullable = false) 
    private int operationFk; 



} 

ここで、両側には双方向バインディングがあります。

+0

これには2つの複合キーがあります。別の答えとは違う。あなたは正解をお勧めしますか? – wthamira