我不能让我的双向关系奏效。 在阅读了几个小时的教程之后,我有了这些课程:
SourceSystems.java
@Entity
@Table(name = "source_systems")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class SourceSystems implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "name", nullable = false)
private String name;
@NotNull
@Column(name = "url", nullable = false)
private String url;
@Column(name = "identifier")
private String identifier;
@NotNull
@Column(name = "trading_activated", nullable = false)
private boolean tradingActivated;
@OneToMany(mappedBy="sourceSystems", fetch = FetchType.EAGER)
private List<Currency> currencies;
// getters and setters
Currency.java
@Entity
@Table(name = "currency")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Currency implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "name", nullable = false)
private String name;
@NotNull
@Column(name = "identifier", nullable = false)
private String identifier;
@Column(name = "currency_ext_id")
private String currencyExtId;
@Column(name = "disabled")
private Boolean disabled;
@Column(name = "date_added")
private ZonedDateTime dateAdded;
@ManyToOne
@JoinColumn(name="source_systems_id")
private SourceSystems sourceSystems;
一个 SourceSystem有 n 货币。 我的目标是获得SourceSystems列表,并在每个源系统中获取货币列表中的货币。
当我打电话给
时sourceSystemsRepository.findAll();
它返回了一个源系统列表,但其货币为空。我也尝试过这样的存储库中的连接:
@Query("select source_systems from SourceSystems source_systems inner join source_systems.currencies currs where source_systems.tradingActivated = true")
List<SourceSystems> findAllActiveSourceSystemsWithCurrencies();
它给了我一套SourceSystems,但它们的重复次数与sourceSystem的货币一样多。但是,在SourceSystem内部,货币列表为空。
关于调用异常:我多次重新生成toString方法,但没有成功。
我认为存储库中的查询存在问题。
有人可以帮我吗?
答案 0 :(得分:0)
您面临的问题可能是延迟加载问题。
尝试JOIN FETCH
获取您的父实体及其子实体急切。
@Query("select source_systems from SourceSystems source_systems join fetch source_systems.currencies currs where source_systems.tradingActivated = true")
List<SourceSystems> findAllActiveSourceSystemsWithCurrencies();
答案 1 :(得分:0)
我认为@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
正在创建此问题
请阅读hibernate doc了解更多详情
尝试删除它并重试,因为您已经指定了FetchType.EAGER应该可以正常工作。
那个人给了我一些非常奇怪的东西: =&gt;很明显,您正在进行内连接,因此您的父表将被重复 因为加入儿童桌的次数。 只需迭代列表货币,就可以正常工作。