возможно ли создать отношения в hibernate / jpa, которые извлекаются, когда извлекается содержащая сущность, но никогда не приводят к обновлениям БД, когда сохраняющая сущность сохраняется?Я попытаюсь прояснить требование на примере.
У меня есть простая сущность B
@Entity
public class B {
private int bId;
@Id
public int getBId() {
return bId;
}
public void setBId(int aId) {
bId = aId;
}
}
И еще одна сущность A, которая содержит однонаправленное множество ко многимсопоставление с этим классом.
@Entity
public class A {
private int aId;
private List<B> bs;
@Id
public int getAId() {
return aId;
}
public void setAId(int aId) {
this.aId = aId;
}
@ManyToMany
@JoinTable(name = "A_B",
joinColumns = {@JoinColumn(name = "AID")},
inverseJoinColumns = {@JoinColumn(name = "BID")}
)
public List<B> getBs() {
return bs;
}
public void setBs(List<B> aBs) {
bs = aBs;
}
}
Когда сущность A извлекается из базы данных и впоследствии объединяется следующим образом
A a = em.find(A.class, 1);
a.getBs().size();
em.merge(a);
, объединение приводит к следующим операторам SQL
Hibernate:
delete
from
A_B
where
AID=?
Hibernate:
insert
into
A_B
(AID, BID)
values
(?, ?)
Hibernate:
insert
into
A_B
(AID, BID)
values
(?, ?)
Я должен избегать этих удалений + обновлений.Для моего приложения я могу гарантировать, что таблица сопоставления никогда не будет обновляться с помощью hibernate.В любом случае, требуется обновить содержащую сущность.
Поэтому мой вопрос таков: возможно ли отобразить такие коллекции «только для чтения» и избежать изменений в БД?
С наилучшими пожеланиями
Томас
Обновление:
Вот таблицы и данные, которые я использую:
CREATE TABLE A (
AID INTEGER NOT NULL
)
DATA CAPTURE NONE ;
CREATE TABLE B (
BID INTEGER NOT NULL
)
DATA CAPTURE NONE ;
CREATE TABLE A_B (
AID INTEGER NOT NULL,
BID INTEGER NOT NULL
)
DATA CAPTURE NONE ;
INSERT INTO A (AID) VALUES (1);
INSERT INTO B (BID) VALUES (1);
INSERT INTO B (BID) VALUES (2);
INSERT INTO A_B (AID, BID) VALUES (1, 1);
INSERT INTO A_B (AID, BID) VALUES (1, 2);
В дополнение к коллекциитакже необходимо инициализировать перед выполнением слияния:
a.getBs().size();
Примечание: я также добавил строку сверху к исходному сообщению.