【发布时间】:2018-11-30 20:49:16
【问题描述】:
我之前有 @PrimaryKeyJoinColumn 工作,现在我正在尝试使用 spring boot,但我不知道我错过了什么,这很奇怪,因为我似乎做对了所有事情:
人物类:
@Table(name = "PERSON")
@Entity
@Getter
@Setter
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(cascade = CascadeType.PERSIST)
@PrimaryKeyJoinColumn
private Department department;
}
部门类:
@Table(name = "DEPARTMENT")
@Entity
@Getter
@Setter
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "department")
private Person person;
}
服务等级:
@Transactional
public void addPerson() {
Person person = new Person();
person.setName("person 1");
Department department = new Department();
department.setName("test");
department.setPerson(person);
person.setDepartment(department);
personRepository.save(person);
}
这就是我在数据库中得到的: 人员表:
ID Name
13 person 1
部门表:
ID Name
18 test
期望的输出:两个 ID 应该相同(个人 ID 应该是 18 而不是 13) 有什么想法吗?
更新: hibernate 总是尝试插入没有 ID 的 Person,所以如果我从 Person ID 中删除自动增量并尝试插入具有现有部门的人员,我会得到:
Hibernate: insert into person (name) values (?)
Field 'id' doesn't have a default value
更新 2: 似乎@PrimaryKeyJoinColumn 不会将 ID 生成处理为部门类,所以我需要使用生成器。我想知道,因为相同的注释在继承中起作用,而对子类的 ID 没有做任何事情。所以我期待一个答案来解释为什么 ID 生成在 Inheritance join 中起作用,而 OneToOne 需要一个生成器
【问题讨论】:
-
Person中的private long id应该是private Long id吗? -
@RobertBain 我试过了,同样的问题
-
您是否也尝试过保存部门?例如。
departmentRepository.save(department) -
@RobertBain 是的,我尝试不使用级联并首先保存部门。
-
@RobertBain 我尝试使用标准的 getter/setter 相同的问题。所需的输出都应具有相同的 ID
标签: java spring hibernate shared-primary-key