Когда я сопоставил сущность JPA с @ManyToOne и извлек тип с помощью Lazy, возникла исключительная ситуация lazyconnectionException, если я сохранил сущность.
Сначала я попытался использовать FetchType для Eager.Но я слышал, что эта опция плоха в производительности.
Во-вторых, я попробовал аннотацию @Transactional на всех классах, связанных с моим методом.
Таблица «Brand».
create table brand
(
id bigint auto_increment
primary key,
parent_id bigint null,
name varchar(20) not null,
ticket_symbol varchar(20) null,
display_status varchar(20) default 'SHOW' not null,
call_brand_id varchar(45) null,
talk_brand_id bigint null,
create_date datetime null,
create_by varchar(20) null,
modify_date datetime null,
modify_by varchar(20) null
);
И таблица Brand должна отображаться сама. Это означает, что таблица Brand может иметь родительскую таблицу. Поэтому я пишу свой Код сущности с этим.
@Slf4j
@Getter
@Setter
@Entity
@Table(name = “{tablename}", schema = “{scehmaname}")
public class TicketBrand extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id", referencedColumnName = "id")
private TicketBrand parentTicketBrand;
@Column
private String name;
@Column
private String ticketSymbol;
@Column
@Enumerated(value = EnumType.STRING)
private DisplayStatus displayStatus;
@Column
private String callBrandId;
@Column
private Long talkBrandId;
@OneToMany(mappedBy = "parentTicketBrand")
private List<TicketBrand> subTicketBrands;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "brand_agent_mapping",
joinColumns = @JoinColumn(name = "brand_id"),
inverseJoinColumns = @JoinColumn(name = "agent_id"))
private Set<TicketAgent> agents;
public TicketBrandView convertTicektBrandView() {
return TicketBrandView.builder()
.id(id)
.parentBrandId(hasParentBrandId())
.name(name)
.ticketSymbol(ticketSymbol)
.displayStatus(displayStatus)
.callBrandId(callBrandId)
.talkBrandId(talkBrandId)
.agentCount(getAgentSize())
.build();
}
public void addSubBrand(TicketBrand subBrand) {
if (subTicketBrands == null) {
subTicketBrands = new ArrayList<>();
}
subBrand.setParentTicketBrand(this);
log.info(subTicketBrands.toString());
subTicketBrands.add(subBrand);
}
public Long hasParentBrandId() {
return Optional.ofNullable(parentTicketBrand).isPresent() ? parentTicketBrand.getId() : null;
}
public int getAgentSize() {
return Optional.ofNullable(agents).isPresent() ? agents.size() : 0;
}
}
В этой ситуации я вызываю функцию «addSubBrand»генерирование исключений, TicketBrand.subTicketBrands, не может инициализировать прокси-сервер - нет сеанса. И я вызываю эту функцию следующим образом.
public void mappingBrand(Long ticketBrandId, Long parentBrandId) {
TicketBrand ticketBrand = ticketBrandService.findBrandById(ticketBrandId);
TicketBrand parentBrand = ticketBrandService.findBrandById(parentBrandId);
parentBrand.addSubBrand(ticketBrand);
}
Затем происходит LazyConnectionTimeoutError.