У нас есть что-то вроде ниже:
@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
класс!