【问题标题】:Null collection on OpenJPA relation mapping when used in Spring context在 Spring 上下文中使用 OpenJPA 关系映射时的空集合
【发布时间】:2015-04-02 11:21:01
【问题描述】:

我有以下 2 个实体:


@Entity
public class User implements java.io.Serializable {

    private Integer iduser;
    private String email;
    private String password;
    private Byte enabled;
    private Set<Token> tokens = new HashSet<>(0);

    public User() {
    }

    public User(String email, String password, Byte enabled/*, Set groupRights*/, Set tokens) {
        this.email = email;
        this.password = password;
        this.enabled = enabled;
        this.tokens = tokens;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "iduser", unique = true, nullable = false)
    public Integer getIduser() {
        return this.iduser;
    }

    public void setIduser(Integer iduser) {
        this.iduser = iduser;
    }

    @Column(name = "email", unique = true, length = 45)
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "password", length = 60)
    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Column(name = "enabled")
    public Byte getEnabled() {
        return this.enabled;
    }

    public void setEnabled(Byte enabled) {
        this.enabled = enabled;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    public Set<Token> getTokens() {
        return this.tokens;
    }

    public void setTokens(Set<Token> tokens) {
        this.tokens = tokens;
    }

}

@Entity
public class Token implements java.io.Serializable {

    private String idtoken;
    private User user;
    private Date tokenTtl;
    private String ipLock;

    public Token() {
    }

    public Token(String idtoken) {
        this.idtoken = idtoken;
    }

    public Token(String idtoken, User user, Date tokenTtl, String ipLock) {
        this.idtoken = idtoken;
        this.user = user;
        this.tokenTtl = tokenTtl;
        this.ipLock = ipLock;
    }

    @Id
    @Column(name = "idtoken", unique = true, nullable = false, length = 36)
    public String getIdtoken() {
        return this.idtoken;
    }

    public void setIdtoken(String idtoken) {
        this.idtoken = idtoken;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    public User getUser() {
        return this.user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "token_ttl", length = 19)
    public Date getTokenTtl() {
        return this.tokenTtl;
    }

    public void setTokenTtl(Date tokenTtl) {
        this.tokenTtl = tokenTtl;
    }

    @Column(name = "ip_lock", length = 45)
    public String getIpLock() {
        return this.ipLock;
    }

    public void setIpLock(String ipLock) {
        this.ipLock = ipLock;
    }

}

问题是,当我使用此 JPA-QL:select u from User u 选择用户时,我得到一个与 Tokens 相关的空 Set,即使该用户有关联的令牌。 仅当我在 Spring 4 上下文中获取 JPA 上下文 (EntityManager) 时才会出现此问题。如果我在做一个测试,直接创建EntityManager(使用这个:Persistence.createEntityManagerFactory("unit-name");),这个问题就不存在了。

谁能告诉我问题的原因是什么?

【问题讨论】:

  • 您是否尝试在 @ManyToOne(fetch = FetchType.LAZY) 的令牌实体中使用 cascade=CascadeType.ALL

标签: java spring jpa one-to-many openjpa


【解决方案1】:

你需要这样使用

 private Set<Token> tokens = new HashSet<Token>(0);

相应地创建 Getter Setter

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    public Set<Token> getTokens() {
        return this.tokens;
    }

    public void setTokens(Set<Token>tokens) {
        this.tokens = tokens;
    }

【讨论】:

  • 只是标签显示问题。我的代码中已经有这个了。
【解决方案2】:

这个问题与 OpenJPA 的一个错误有关。 在 OpenJPA 中,您使用 FetchType.EAGER 获取类型创建双向 @OneToMany 关系时,由于无法创建此关系而出现错误。该错误在某些版本中已修复。似乎影响版本 2.1.0、2.2.2、2.3.0 和 2.4.0。

参考资料:

https://issues.apache.org/jira/browse/OPENJPA-2505

Spring Data JPA OneToMany and ManyToOne give me JpaSystemException

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @Magnilex 谢谢。希望现在更好。
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2018-07-11
  • 2021-11-24
  • 2014-01-01
相关资源
最近更新 更多