Hibernate为@OneToOne返回null

时间:2014-04-03 11:24:27

标签: hibernate

我在User班级中定义了这种关系:

@OneToOne (cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn (name = "id")
    private Balance balance;

Hibernate使用正确的关系创建必要的表。

但是,当我使用以下代码检索User个对象时,Balance设置为null

User fetchedUser = userRepository.findOne(id);        
Balance balance = fetchedUser.getBalance();

为什么会这样?

(我使用Spring Data进行数据访问。)

编辑:

此代码生成users表:

CREATE TABLE `users` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `contact_number` VARCHAR(255) NOT NULL,
    `date_created` DATE NOT NULL,
    `date_of_birth` DATE NOT NULL,
    `device_id` VARCHAR(255) NOT NULL,
    `email` VARCHAR(255) NULL DEFAULT NULL,
    `gender` TINYINT(1) NOT NULL,
    `location` VARCHAR(255) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `password` VARCHAR(255) NOT NULL,
    `username` VARCHAR(255) NOT NULL,
    `balance_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK6A68E08CBE6702` (`balance_id`),
    CONSTRAINT `FK6A68E08CBE6702` FOREIGN KEY (`balance_id`) REFERENCES `balances` (`id`)
)

这会生成balances

CREATE TABLE `balances` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `total_claimed` INT(11) NOT NULL,
    `total_won` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
)

2 个答案:

答案 0 :(得分:1)

@JoinColumn注释名称中引用将外键存储到关系的其他部分的列。我只能假设,在映射列id中存储User的标识符(PrimaryKey)。也许它应该是这样的:

@OneToOne(cascade = CascadeType.ALL)
@JoinColum(name = "balance_id" referencedColumnName = "id")
private Balance balance;

满足以下要求时,上述映射将起作用:

    指向USERS表中关联记录的BALANCES表中的
  • 列名为balance_id
  • BALANCES表中的PrimaryKey列名为id

如果您的应用程序中使用的名称不同,则必须相应地调整此映射。

此外,您可能希望关系是双向的。在这种情况下,您应该将以下映射添加到Balance实体:

@OneToOne(mappedBy = "balance")
private User user;

答案 1 :(得分:0)

请添加外键约束,然后重试。

CREATE TABLE `balances` (
   `balance_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `total_claimed` INT(11) NOT NULL,
   `total_won` INT(11) NOT NULL,
   `user_id` BIGINT(20),
   PRIMARY KEY (`id`)
)

alter table balances add constraint XFK_USER foreign key (user_id)
  references users (id);