我在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`)
)
答案 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);