我正在使用postgresql数据库,我有以下表格:“user”,“game”和“game_user”都在架构“allin”中。在我的Web应用程序中,我正在使用Hibernate 4.3.5,Spring MVC和spring data jpa。
在我的Game类中,我有以下OneToMany关系:
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(schema = "allin", name = "game_user",
joinColumns = { @JoinColumn(name = "game_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id",nullable=true) })
private List<User> users;
这是我的单元测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ServletInitializer.class, SecurityWebApplicationInitializer.class, WebMvcConfig.class})
@WebAppConfiguration
public class GameRepositoryTest
{
@Autowired
private GameService gameService;
@Autowired
UserService userService;
@Test
public void testRepostory()
{
List<User> users = new ArrayList<User>();
users.add(userService.findByUsername("luizcarlosfx"));
users.add(null);
users.add(null);
Game newGame = new Game(users, 10);
Game savedGame = gameService.save(newGame);
assertNotNull(savedGame);
Game getGame = gameService.findById(savedGame.getId());
assertEquals("There must be the same amount of users in the craeted game and in the saved game",newGame.getUsers().size(), getGame.getUsers().size());
}
}
当我运行我的单元测试时,我收到以下错误:“在有问题的游戏和已保存的游戏中必须有相同数量的用户。预期:&lt; 3&gt;但是:&lt; 1&gt ;.”
问题是hibernate没有保存用户列表中的空值,我需要将我的访客播放器保存为null,因为它们没有任何用户。这部分应用程序必须保存我的多人游戏的游戏历史记录。
我的问题是如何让hibernate保存空值?
答案 0 :(得分:0)
使用
inverseJoinColumns = { @JoinColumn(name = "user_id",nullable=true) })
不允许您保存Null-Object
。您无法保存Null
(作为对象,但作为值)。 Null
是一个不存在的对象。即使您可以设法保存一行填充空值,您又如何将其分配给 ANY 来宾?
这并不意味着 user_id 可以是null
。因为外部行是由id引用的(如你的定义所示),因此允许null,这意味着只有一个条目。
Nullable = true
表示:您可以使用否直至 MANY 用户保存游戏。 - 但 MANY 的每个用户都需要与null
不同,且ID与null
不同。
因此,如果你致电game.setUsers(null)
- 你可以保存。如果你致电game.getUsers().add(null)
- 你就可以了。