Как сохранить объекты и связанные с ними объекты в спящем режиме, если первичный ключ - не единственный уникальный столбец - PullRequest
0 голосов
/ 04 июня 2019

Итак, моя проблема в том, что у меня есть классы 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

и Нарушение ограничения дляУникальность этикетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...