【问题标题】:Hibernate @OneToMany not saving null values inside my ListHibernate @OneToMany 不在我的列表中保存空值
【发布时间】:2014-05-08 19:55:34
【问题描述】:

我正在使用 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());

    }
}

当我运行单元测试时,我收到以下错误:“创建的游戏和保存的游戏中必须有相同数量的用户。预期: 但实际:。”

问题是休眠没有保存用户列表中的空值,我需要将我的访客玩家保存为空,因为他们没有任何用户。这部分应用程序必须保存我的多人游戏的游戏历史记录。

我的问题是如何让休眠也保存空值?

【问题讨论】:

    标签: java spring hibernate postgresql jpa


    【解决方案1】:

    使用

    inverseJoinColumns = { @JoinColumn(name = "user_id",nullable=true) })
    

    不允许您保存Null-Object。您不能保存 Null (作为对象,但作为值)。 Null 是不存在的对象。即使您可以设法保存一行充满空值 - 您如何再次将其分配给 ANY 客人?

    这并不意味着 user_id 可以是null。由于外来行由 id 引用(根据您的定义),因此允许 null 意味着可能只有一个条目。

    Nullable = true 在这种情况下意味着:您可以保存游戏,NO 最多 MANY 用户。 - 但是每个 MANY 用户都需要与 null 不同,并且 ID 与 null 不同。

    因此,如果您致电game.setUsers(null) - 您可以保存。如果你打电话给game.getUsers().add(null) - 你不能。

    【讨论】:

    • 我想你不明白。当然我可以保存很多客人,我不需要任何客人信息,我只需要知道客人参加过那场比赛。当我在数据库中手动插入空值时,这是可行的。插入到 allin.game_user (game_id, user_id) values(10, null);
    • 我理解,但我想说这是不可能的。这可以手动工作,但不适用于休眠。 Hibernate 保持 OBJECTS 并接受 null 作为值 - 但它不能处理 null 对象,因为 null 对象“不存在”(hibernate 会尝试保存null.getUserId() - 可以这么说)。既然您不保存任何有关来宾的信息:为什么不在 game_entity 中添加一列 guest_count 并在需要时增加它?
    • 我已经考虑过了,但决定尝试保存空值,因为它确实可以手动工作,我认为它也可以使用 hibernate... 无论如何感谢您的帮助
    • 我会保存玩家的数量(users.size()),这样就很容易知道我每场比赛有多少客人。
    • 但是您需要在保存之前从用户集合中删除空值。我什至不会添加它们。如果 ENTITY 不是用户类型 - 它不属于 Collection
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2018-09-11
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多