2017-01-21 3 views
1

Je souhaite avoir une relation ManyToOne entre 2 classes (Chapitre & Caméra). Un objet de chapitre contient de nombreux objets Camera.Ressort OneToMany relation avec une touche composite à une autre avec une touche composite

Le problème est que ma classe parente (Chapter) a déjà une clé composite.

Chapitre clé composite:

@Embeddable 
public class ChapterKey implements Serializable { 

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

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

classe Chapitre:

@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; 
} 

touche Appareil photo:

@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; 
} 

classe 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; 
} 

Ma question est, comment puis-je faire une relation OneToMany entre ces 2 classes?

Répondre

0

C'est ER pour pk(camera_id) & problème pk(chapter_id,operation_fk)

enter image description here

Ceci est une classe de chapitre.

@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; 

} 

Ceci est le chapitrePK.class qui définit la clé primaire de votre classe de chapitre. il a une clé primaire composite.

@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; 

} 

camera.class enfin

@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; 

} 

Ici j'utilise deux voies de liaison dans les deux classes de chapitre et de la caméra. si vous utilisez une clé primaire composite. vous devez gérer un objet clé primaire incorporé supplémentaire.

+0

Avant que mon code ne soit pas correct. ajouter des getters et setters pour le code et le vérifier – wthamira

+0

en plus ce code est généré depuis Netbeans. Si ER est correct, la réponse est correcte à 100%. – wthamira

+0

Merci beaucoup, votre réponse ne correspond pas exactement à ce que vous cherchiez, mais vous m'avez poussé dans la bonne direction. Avec quelques réglages, ça a marché! –

0

Cette réponse pour le chapitre côté pk(Chapter_ID, Operation_FK) et du côté de la caméra pk(camera_id,chapter_fk,operation_fk)

ER pour est ci-dessous.

enter image description here

Chapter.class est

@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; 



} 

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

@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; 



} 

Ici, les deux côtés ont une liaison bidirectionnelle.

+0

celui-ci a deux clés composites. différent d'une autre réponse. Pouvez-vous suggérer une réponse correcte? – wthamira