Как решить проблему сужения прокси-сервера при использовании стратегии наследования SINGLE_TABLE в спящем режиме? - PullRequest
0 голосов
/ 28 октября 2018

У нас есть что-то вроде ниже:

@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Long id;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        BaseEntity that = (BaseEntity) o;
        if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        return Objects.hash(getId());
    }
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "BASE_ORGANIZATION")
@DiscriminatorColumn(name = "disc")
@DiscriminatorValue("baseOrganization")
public class BaseOrganization extends BaseEntity {

    @Column(name = "TITLE")
    private String title;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "BASE_PERSONNEL")
@DiscriminatorColumn(name = "disc")
@DiscriminatorValue("basePersonnel")
public class BasePersonnel extends BaseEntity {

    @Column(name = "FIRSTNAME")
    private String firstName;

    @Column(name = "LASTNAME")
    private String lastName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "BASE_ORGANIZATION_ID")
    private BaseOrganization baseOrganization;
}

BaseEntity, BasePersonnel и BaseOrganization в core_project , что все проекты могут использовать эти объекты.Теперь мы создаем проект, который зависит от core_project.Мы должны расширить BasePeronnel и BaseOrganization в зависимости от контекста нашего бизнеса.По этой причине мы добавили несколько классов в наш проект, как показано ниже:

@Entity
@DiscriminatorValue("organization")
public class Organization extends BaseOrganization {

    @Column(name = "MISSION_Type")
    private String missionType;
}

@Entity
@DiscriminatorValue("personnel")
public class Personnel extends BasePersonnel {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MISSION_ORGANIZATION_ID")
    private Organization missionOrganization;
}

Наша проблема возникает, когда мы хотим получить весь персонал.Когда мы вызывали метод getAllPersonnel в PersonnelRepository, в журнале гибернации появилось следующее сообщение:

WARN  o.h.e.i.StatefulPersistenceContext - HHH000179: Narrowing proxy to class org.xyz.organization.Organization - this operation breaks ==

После этого, когда мы видим List<Personnel> объект, свойство missionOrganization имеет значение null, но baseOrganizationзагружено свойство в суперклассе!

Мы думаем, что когда класс буксировки, имеющий стратегию наследования SINGLE_TABLE, hibernate LazyInitializer не может определить правильный конкретный класс.

Также мы отладили метод narrowProxy в StatefulPersistenceContext класс и мы поняли, что concreteProxyClass.isInstance(proxy) вернул false.потому что proxy объект имеет BaseOrganization объект в LazyInitializer и concreteProxyClass ссылаются на Organization класс!

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