当我使用@ManyToOne映射JPA实体本身并使用Lazy映射类型时,如果我保存该实体,则会发生lazyconnectionException。
首先,我尝试将FetchType应用于Eager。但是我听说此选项不利于性能。
第二,我在与我的方法相关的所有类上尝试了@Transactional Annotation。
“品牌”表。
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。
答案 0 :(得分:0)
此问题已解决。
我使用Hikari Pool连接处理程序设置数据库设置,
然后我连接到多个Hikari Pool的数据库模块
所以我在一个池中使用@Primary注释,这会引起问题。
我找不到有关此问题的确切解决方案,但我解决了此问题,将项目分成几部分。