ManyToOne OneToMany JPA映射无法正常工作

时间:2017-05-05 17:24:43

标签: jpa spring-data spring-data-jpa

我觉得OneToMany,ManyToOne映射存在问题。

我在这里使用名为“ur”的CrudRepository:

ur.save(new User("zx","z", "a", "email@email.com", "Baa")); //userRepo save
User u1 = ur.findOneByUserName("Bx");
MyToken t1 = new MyToken("X5");
u1.addToken(t1);
ur.save(u1);
MyToken t2 = TokenRepo.findOneByToken("X5"); // a different crudRepository
String foundUser = t2.getUser().getUserName(); // THIS "user" is null.

User.java的相关部分(扩展AbstractPersistable< Long>):

@OneToMany(fetch = FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy = "user")
private Set<Role> roles = new HashSet<Role>(1);

@OneToMany(fetch = FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy = "user")
private Set<MyToken> token = new HashSet<MyToken>();

MyToken.java(扩展AbstractPersistable&lt; Long&gt;):

 @ManyToOne(fetch = FetchType.EAGER, cascade={CascadeType.ALL})
 @JoinColumn(name="user") // commenting this out or not does nothing...
    private User user;

我的调试器在“String foundUser”行说'user'为'null',即使根据代码完全错误也是如此。

正如你所看到的,所有都是“渴望”,所以我不明白为什么MyToken.setUser()不会自动完成。他们怎么没联系了?如果您已经使用User.addToken和UserRepo.save(),则AnyInitiatedToken.getUser()不应为null。

注意:我也为MyToken.java和Role.java类尝试了.LAZY(但仍然无效)。

2 个答案:

答案 0 :(得分:2)

由于你没有发布setter,我会认为它们看起来像默认的setter。

User.token已设置,但它有mappedby,因此它与存储在数据库中的内容实际上无关。 Token.user很重要,但仍然是NULL,这就是保存和检索的内容。

您有两种选择:

  1. 更改User.setToken()以更新传递的Token.user(以及之前设置的那个)的Token

  2. 每当您致电User.setToken()时,也请更新Token.users以使关系的两个方向都匹配。

答案 1 :(得分:0)

我认为它与提取策略无关,无论是渴望还是 lazy 提取类型。我认为您为用户的ID提供了列别名,并且错过了{em>名称 atributte的@JoinColumn值应该引用该主键列别名。

用户一样,你有:

@Id
@Column(name = "userid", unique = true, nullable = false)
public String getUserId() {
return this.userId;
    }

然后在令牌中应该是

@ManyToOne(fetch = FetchType.EAGER, cascade={CascadeType.ALL})
@JoinColumn(name="userid") // commenting this out or not does nothing...
private User user;