Sql Hibernate主键注释返回空值
我在跟踪 用于学习主键注释 我有两节课Sql Hibernate主键注释返回空值,sql,spring,hibernate,Sql,Spring,Hibernate,我在跟踪 用于学习主键注释 我有两节课 @Id @Column @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String firstName; private String lastName; private String email; private String password; private String profession; @OneToOne(mappedBy="user" , c
@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String firstName;
private String lastName;
private String email;
private String password;
private String profession;
@OneToOne(mappedBy="user" , cascade=CascadeType.ALL)
private Profile profile;
还有我的个人资料课
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private int id; //profileId
private int userId;
private String specialization;
private String hospital;
private String clinicAddress;
private String clinicTime;
private String about;
@OneToOne
@PrimaryKeyJoinColumn
private User user;
两个表中都有条目,但我得到的是profile的null
值。谁能告诉我我的代码有什么问题吗。我的桌子是空的
配置文件表为:
CREATE TABLE `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`specialization` varchar(100) DEFAULT NULL,
`hospital` varchar(100) DEFAULT NULL,
`clinicAddress` varchar(100) DEFAULT NULL,
`clinicTime` varchar(12) DEFAULT NULL,
`about` varchar(300) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk` (`userId`),
KEY `pfk` (`userId`),
CONSTRAINT `pfk` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1$$
用户表是
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
firstName varchar(45) DEFAULT NULL,
lastName varchar(45) DEFAULT NULL,
email varchar(45) DEFAULT NULL,
password varchar(45) DEFAULT NULL,
profession varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$
编辑:当我使用
@JoinColumn(name = "userId")
private User user;
然后从Profile类中删除userId
字段,它可以查找并获取Profile对象
现在,当我在Profile类中添加userId
字段时,我得到
Repeated column in mapping for entity: com.analyst.future.domain.Profile column: userId (should be mapped with insert="false" update="false")
UserProfileForm:
UserProfileForm {
private int userId;
private String specialization;
private String hospital;
private String clinicAddress;
private String clinicTime;
private String about;
控制器:
public String registerNewUser(HttpServletRequest request, @ModelAttribute ("form") SignupForm form){
User user = new User();
try {
BeanUtils.copyProperties(user, form);
} catch (IllegalAccessException e) {
logger.error("ERROR : unable to copy values from form to user object");
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Integer userId = userService.addUser(user);
UserProfileForm profileForm = new UserProfileForm();
profileForm.setUserId(userId);
profileService.addProfile(profileForm);
mailService.sendAccountCreatingNotification(user);
return REDIRECT_CONFIRMATION_VIEW;
}
在役:
public Profile addProfile(UserProfileForm form) {
Profile profile = new Profile();
try {
BeanUtils.copyProperties(profile, form);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return profileDAO.addProfile(profile);
}
在ProfileDAOImpl中
public Profile addProfile(Profile profile) {
Session session = this.sessionFactory.getCurrentSession();
session.persist(profile);
return profile;
}
映射表明profile的ID也是一个连接列(即引用用户ID的外键)。这就是
@PrimiryKeyJoinColumn
的意思
但是您的表定义显示,您在概要文件中有一个userId列来引用概要文件的用户ID。因此,您实际上应该使用@JoinColumn(name=“userId”)
下定决心,选择你真正想做的事情。在Profile object中,你有以下几行:
@OneToOne
@PrimaryKeyJoinColumn
private User user;
将这些更改为:
@JoinColumn(name = "userId")
private User user;
PrimaryKeyJoinColumn注释在此处使用错误。您的数据库表不建议用户id是主键联接列。谢谢您的回复。我这样做了,在这种情况下它也工作得很好,但问题是我必须从Profile类中删除userId变量。在这种情况下,我将无法在配置文件表中添加userId以添加新用户。你在做什么,你预计什么时候会发生,会发生什么?编辑您的问题。我已更新了问题,以反映我在使用您建议的解决方案时遇到的错误。您不应添加userId。您已与用户建立了OneToOne。添加用户id是多余的。是的,你是对的,但是当我从Profile类中删除此字段并添加一个新的配置文件时,用户id中的值为null,这应该是新用户的id。那么我如何将我的用户id设为主键联接列?因为我在使用您建议的解决方案时遇到了一些问题。