Об ошибке тайм-аута сеанса LazyConnection при отображении @ManyToOne - PullRequest
0 голосов
/ 12 июля 2019

Когда я сопоставил сущность 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.

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