Hibernate @OneToMany不在我的List中保存空值

时间:2014-05-08 19:55:34

标签: java spring hibernate postgresql jpa

我正在使用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保存空值?

1 个答案:

答案 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) - 你就可以了。