У меня есть иерархия классов, сопоставленная с InheritanceType.JOINED в Hibernate (финал 3.5.6) с JPA 2.0 -
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A{
private Long id;
@OneToOne
@JoinColumn(name = "foo_id", nullable = false)
private Foo foo;
...
}
@Entity
@PrimaryKeyJoinColumn(name = "B_ID")
public class B{
...
}
@Entity
@PrimaryKeyJoinColumn(name = "C_ID")
public class C{
...
}
А Foo
сущность -
@Entity
public class Foo{
@Id
private Long id;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "foo")
private A a
// getters / setters omitted
}
Теперь я сохранил сущность Foo
со ссылкой B
в поле 'a'. Позже я хотел бы обновить экземпляр Foo со ссылкой на класс C
до свойства 'a', так что я сделал -
loadedFooInstance.setA(new C());
entityManager.merge(loadedFooInstance);
Но то, что я заметил, - он не удаляет исходный объект B, который был назначен этому объекту Foo, перед назначением C. Из-за этого мне нужно вручную удалить всю ссылку A, назначенную этому экземпляру Foo перед назначением нового.
Но я считаю, что hibernate должен иметь возможность справляться с такими сценариями, и я что-то упускаю в своем отображении.
Что-то не так в моем отображении ... или такое отображение может быть достигнуто лучшим способом, поэтому мне не нужно заниматься такой ручной работой.