JPA映射:OneToMany(双向)关系不起作用

时间:2017-07-12 09:16:49

标签: java hibernate jpa

我不能让我的双向关系奏效。 在阅读了几个小时的教程之后,我有了这些课程:

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();

那个人给了我一些非常奇怪的东西: It duplicates the Source System objects by the number of the currencies

它给了我一套SourceSystems,但它们的重复次数与sourceSystem的货币一样多。但是,在SourceSystem内部,货币列表为空。

关于调用异常:我多次重新生成toString方法,但没有成功。

我认为存储库中的查询存在问题。

有人可以帮我吗?

2 个答案:

答案 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)

  1. 我认为@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)正在创建此问题 请阅读hibernate doc了解更多详情 尝试删除它并重试,因为您已经指定了FetchType.EAGER应该可以正常工作。

  2. 那个人给了我一些非常奇怪的东西: =&gt;很明显,您正在进行内连接,因此您的父表将被重复 因为加入儿童桌的次数。 只需迭代列表货币,就可以正常工作。