使用子实体作为搜索参数来检索实体时遇到问题。实体以单向关系与多对一关系相关,每个对象都以FetchType.LAZY的形式获取。 当我通过子实体寻找实体时,结果为null。但是当我设置为“渴望”时,它是正确的。
我的实体:
@NoArgsConstructor
@Getter
@Entity
@Table(name = "partner")
public class PartnerEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String login;
public PartnerEntity(String login) {
this.login = login;
}
}
@NoArgsConstructor
@Getter
@Entity
@Table(name = "point")
public class PointEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "partner_Id")
private PartnerEntity partnerEntity;
public PointEntity(PartnerEntity partnerEntity) {
this.partnerEntity = partnerEntity;
}
}
@NoArgsConstructor
@Getter
@Entity
@Table(name = "orer")
public class OrdEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PAYMENT_POINT_ID")
private PointEntity pointEntity;
public OrdEntity(PointEntity pointEntity) {
this.pointEntity = pointEntity;
}
}
@NoArgsConstructor
@ToString
@Getter
@Entity
@Table(name = "BL")
public class BLEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARTNER_LOGIN", referencedColumnName = "login")
private PartnerEntity partnerEntity;
private String number;
public BLEntity(PartnerEntity partnerEntity, String number) {
this.partnerEntity = partnerEntity;
this.number = number;
}
}
然后我使用OrdEntity子级寻找BLEntity:
final OrdEntity byId = ordRepo.findById(id);
final PartnerEntity partnerEntity = order.getPointEntity().getPartnerEntity();
final BLEntity blEntityResult= blRepo.findOneByNumberAndPartner(number, partnerEntity);
对象partnerEntity不为null,它是正确的对象。 我将blEntityResult设置为null,但如果将PointEntity fetch更改为FetchType.EAGER,则blEntityResult不为null(正确)。
我在以下存储库中的自定义查询:
public interface BLRepo extends JpaRepository<BLEntity, Long> {
@Query("select b from BLEntity b where b.number = :number and b.partnerEntity= :partner")
BLEntity findOneByNumberAndPartner(@Param("number") String number, @Param("partner") PartnerEntity partner);
}
如果正在下载的伙伴对象不是null且正确,为什么会发生?
答案 0 :(得分:0)
我认为您应该在两侧都添加映射, 因为@ AllToMany = Lazy和@ManyToAll = Eager的默认访存类型。 只需在PartnerEntity中添加以下代码。
@OneToMany(mappedBy="partnerEntity" , fetch = FetchType.Eager )
List<BLEntity> blEntity = new ArrayList<>();
答案 1 :(得分:0)
我将FetchType更改为PointEntity中的Eager:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "partner_Id")
private PartnerEntity partnerEntity;
一切正常,但是我不明白为什么它不适用于PaymentType.Lazy。当我寻找时:
final PartnerEntity partnerEntity = order.getPointEntity().getPartnerEntity();
我得到正确的实体“ PartnerEntity”,该实体具有正确的登录字段(login'field的值为“ test”)。
当我将登录级别设置为“ TRACE”时,Hibernate没有绑定正确的登录参数,而是将其设置为null而不是“ test”)为什么? :)