我觉得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(但仍然无效)。
答案 0 :(得分:2)
由于你没有发布setter,我会认为它们看起来像默认的setter。
User.token
已设置,但它有mappedby
,因此它与存储在数据库中的内容实际上无关。 Token.user
很重要,但仍然是NULL
,这就是保存和检索的内容。
您有两种选择:
更改User.setToken()
以更新传递的Token.user
(以及之前设置的那个)的Token
。
每当您致电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;