我试图理解为什么Hibernate在插入(JPA保存)时在值中添加我的模型名称,但我无法弄清楚为什么。
下面是实体模型:
@Entity
@Table(name = "USER")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "person_type")
@Getter
@Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private int id;
@Column(name = "username", unique = true)
private String username;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Any(metaColumn = @Column(name = "person_type", insertable = false))
@AnyMetaDef(idType = "int", metaType = "string",
metaValues = {
@MetaValue(targetEntity = Candidate.class, value = "CANDIDATE"),
@MetaValue(targetEntity = Company.class, value = "COMPANY"),
})
@JoinColumn(name="person_id", insertable = false)
private Object person = null;
}
多态性非常有效。问题是,当我注册一个新用户时,默认情况下应该将person_type
和person_id
设置为 null,执行的查询如下:
insert into `USER` (`email`, `password`, `username`, `person_type`) values (?, ?, ?, ?, 'User')
要插入的代码: user.setPassword(passwordEncoder.encode(user.getPassword())); userRepository.save(user);
我什至尝试在插入之前添加行user.setPerson(null)
,但它是一样的。
请问有什么想法吗?
据我所知,基类需要是一个非实体类,并用@MappedSuperclass
注释。
即您需要一个@MappedSuperclass BaseUser.class
,然后将其扩展为@Entity User extends BaseUser
和@Entity SuperUser extends BaseUser
.
VladMihalcea - 继承自基类 JPA/Hibernate
只需将@DiscriminatorValue("null")
添加到用户实体即可。
详细答案:映射未知鉴别器InheritanceType.SINGLE_TABLE的休眠实体值