关于@ManyToOne映射时的LazyConnection会话超时错误

时间:2019-07-12 01:25:48

标签: java hibernate jpa

当我使用@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。

1 个答案:

答案 0 :(得分:0)

此问题已解决。

我使用Hikari Pool连接处理程序设置数据库设置,

然后我连接到多个Hikari Pool的数据库模块

所以我在一个池中使用@Primary注释,这会引起问题。

我找不到有关此问题的确切解决方案,但我解决了此问题,将项目分成几部分。