2017-01-21 2 views
1

Я хочу иметь отношение 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; 
} 

класс камеры:

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

Мой вопрос: как мне сделать отношения OneToMany между этими двумя классами?

ответ

0

Это ER для pk(camera_id) & pk(chapter_id,operation_fk) проблем

enter image description here

Это класс Глава.

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

} 

наконец camera.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 = "chapterFk", fetch = FetchType.EAGER) 
    private Collection<Camera> cameraCollection; 

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

} 

здесь я использую два способа связывания в обоих глав и камер классов. если вы используете составной первичный ключ. вам необходимо управлять дополнительным встроенным объектом первичного ключа.

+0

Перед тем как мой код станет неправильным. добавьте геттеры и сеттеры для кода и проверьте его – wthamira

+0

Кроме того, это сгенерированный код от Netbeans. Если ER в порядке, то ответ на 100% правильный. – wthamira

+0

Большое спасибо, ваш ответ не совсем то, что искали, но вы толкнули меня в правильном направлении. С некоторыми небольшими изменениями это сработало! –

0

Этот ответ для главы стороны pk(Chapter_ID, Operation_FK) и боковой камеры pk(camera_id,chapter_fk,operation_fk)

ER для ниже.

enter image description here

Chapter.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; 



} 

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; 



} 

Здесь обе стороны имеют двустороннюю привязку.

+0

У этого есть два составных ключа. отличается от другого ответа. можете ли вы предложить правильный ответ, который вы получите. – wthamira

Смежные вопросы