У меня есть приложение, в котором я пытаюсь реализовать отношение ManyToMany между двумя объектами, используя Hibernate в качестве поставщика JPA.
Пример, который я пытаюсь использовать, является однонаправленным, в котором камера может иметь несколько объективов, а объектив может вписываться в несколько камер.
Ниже приведен мой класс сущностей... (Просто вставьте соответствующую его часть)
Камера:
@Entity
@Table(name = "CAMERAS")
public class Camera implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "CAM_ID", nullable = false)
private Long camId;
@Column(name="CAMERA_BRAND")
private String cameraBrand;
@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER)
@JoinTable(name="CAMERA_LENS",joinColumns=@JoinColumn(name="CAM_ID"),inverseJoinColumns=@JoinColumn(name="LENS_ID"))
private Set<Lens> lenses = new HashSet<Lens>();
...
}
Объектив:
@Entity
@Table(name = "LENSES")
public class Lens implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "LENS_ID", nullable = false)
private Long lensId;
@Column(name="LENS_NAME")
private String name;
...
}
В тестовом примере я пытаюсь сохранить экземпляр камеры следующим образом...
@Test
public void test_saveCameraLenseManyToMany() {
Camera cam = new Camera();
cam.setCameraBrand("Nikon");
Set<Camera> cameras = new HashSet<Camera>();
cameras.add(cam);
Set<Lens> lenses = new HashSet<Lens>();
Lens lens1 = new Lens();
lens1.setName("WideAngle");
lenses.add(lens1);
cam.setLenses(lenses);
// concreteDAO.saveLens(lens1);
concreteDAO.saveCamera(cam);
}
Сохранение происходит успешно, и Hibernate не создает никаких ошибок/исключений. Однако, вопреки ожиданиям, строка в JoinTable (в данном случае CAMERA_LENS) не создается. Строка создается только в каждой из таблиц Lens и Camera, что не служит цели ManyToMany. Тем не менее, DDL генерируется для таблицы соединений, и она также создается, но просто в ней нет никаких записей.
Любая помощь или указатели будут высоко оценены.