Итак, моя проблема в том, что у меня есть классы A и B. Эти классы находятся в отношениях ManyToMany.Владелец класса A.
В классе B есть PK с автоинкрементом для PK и метка.Метка снабжена уникальным ограничением.Таким образом, PK и метка должны быть уникальными в базе данных.
Класс B - это, по сути, справочная таблица, которую обычно не следует заполнять при создании объекта класса A, а связывать только с объектами из справочной таблицы.Однако при создании объектов из класса AI известны только метки, но не идентификатор в справочной таблице.
Я уже пробовал много вещей, но ничего с ожидаемым результатом.По сути, я считаю, что это A) проблема с установленным CASCADE I и B проблема инстанцирования объектов, поскольку мне пришлось бы запрашивать базу данных для метки, когда не знал ID.Тем не менее, я не знаю, как это сделать в момент создания экземпляра.
То, что я сейчас пытаюсь использовать в качестве варианта использования, - это создать несколько экземпляров A с несколькими экземплярами B, связанными с каждым.Все B выглядят одинаково с id = 1L и label = "ABC".
Когда я устанавливаю CASCADE Type на "Merge", я не получаю ошибку, но моя таблица B остается пустой, в то время как другие мои таблицыуже заполнены.
Это два класса.
Некоторые могут спросить, почему я не использую метку в качестве первичного ключа.Моя причина в том, что я предполагаю, что идентификатор, который я хочу использовать позже при сравнении операций, работает лучше, чем если бы я использовал строку.Также я использую объект и в других отношениях, где, как мне кажется, лучше использовать идентификатор.
Еще одно замечание: я читал о методе euqals, который играет роль в этом сценарии.Может быть, дело в этом?
@Entity
public class A implements Serializable, Persistent
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "A_id", unique = true, nullable = false)
public final Long id;
@Column(unique = true)
public final String label;
@ManyToMany(mappedBy = "A_s")
private Set<B> B_s = new HashSet<>();
@PersistenceConstructor
@JsonCreator
public A(@JsonProperty(value = "id", required = true) Long id, @JsonProperty(value = "label", required = true) String label) {
this.id = id;
this.label = label;
public A(String label) {
this(null, label);
}
}
@Entity
public class B implements Iterable<A>, Persistent
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public final Long id;
@ManyToMany(fetch = FetchType.LAZY)
@Cascade({CascadeType.MERGE})
@JoinTable(
name = "A_B",
joinColumns = { @JoinColumn(name = "B_id") },
inverseJoinColumns = { @JoinColumn(name = "A_id") }
)
Set<A> A_s = new HashSet<>();
@PersistenceConstructor
private B(Long id, Set<A> A_s)
{
this.id = id;
this.A_s = A_s;
}
@JsonCreator
public B(@JsonProperty(value = "A_s", required = true) Set<A> A_s)
{
this(null, A_s);
}
То, что я хотел бы видеть, это:
Я создаю экземпляр Mutiple, как с несколькими B.Я сохраняю свои As и B тоже сохраняются, но только если их еще нет в базе данных.Нахождение в базе данных определяется как метка уже в базе данных.Не первичный ключ.Это должно быть получено, если метка уже находится в базе данных.
В основном я получаю следующие ошибки: org.hibernate.PersistentObjectException: отсоединенная сущность, переданная в persist
и Нарушение ограничения дляУникальность этикетки.