2014-09-10 86 views
1

我是JPA的新手。我在定义OneToOne双向流时遇到了麻烦。org.hibernate.MappingException:无法找到具有逻辑名称的列OnetoOne映射

UserInfo.java:

@Entity 
@Table(name="UserInfo") 
public class UserInfo { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer idUserInfo; 
private String firstName; 
private String lastName; 


@OneToOne(mappedBy="UserInfo") 
private LoginInfo loginInfo; 

LoginInfo.java:

@Entity 
@Table(name="LoginInfo") 
public class LoginInfo { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer idLoginInfo; 

@Column(name="emailId") 
private String emailId; 

//bidirectional one to one association to UserInfo 
@OneToOne 
@JoinColumn(name="emailId", referencedColumnName="loginInfo") 
private UserInfo userInfo; 


private String sessionId; 
private String password; 

下面的SQL创建这些表:

CREATE TABLE `LoginInfo` (
    `emailId` varchar(45) NOT NULL, 
    `idLoginInfo` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`idLoginInfo`), 
    UNIQUE KEY `emailId_UNIQUE` (`emailId`), 
    UNIQUE KEY `id_UNIQUE` (`idLoginInfo`) 
    ); 

    DROP TABLE IF EXISTS `UserInfo`; 
    CREATE TABLE `UserInfo` (
     `idUserInfo` int(11) NOT NULL AUTO_INCREMENT, 
     `firstName` varchar(45) NOT NULL, 
     `lastName` varchar(45) NOT NULL, 
     `loginInfo` varchar(45) NOT NULL, 
     PRIMARY KEY (`idUserInfo`), 
     UNIQUE KEY `idUserInfo_UNIQUE` (`idUserInfo`), 
     UNIQUE KEY `loginInfo_UNIQUE` (`loginInfo`), 
     CONSTRAINT `loginInfo` FOREIGN KEY (`loginInfo`) REFERENCES `LoginInfo` (`emailId`) ON DELETE CASCADE ON UPDATE CASCADE 
    ); 

当我启动Tomcat服务器,我在ContextInitialization上获得以下例外。

Caused by: org.hibernate.MappingException: Unable to find column with logical name: loginInfo in org.hibernate.mapping.Table(UserInfo) and its related supertables and secondary tables 

但是,该列确实存在于UserInfo表中。如果地图是正确的,有人可以帮助我吗?

由于

回答

1

阅读OneToOne映射,注释和一些试验&错误后,我能够成功使用LoginInfo和UserInfo表。在我上面的问题中,它有一些无效的映射。要求是UserInfo是所有者实体,LoginInfo是子实体。正如ashokhein所建议的,我使用了PrimaryKeyJoinColumn注解。这就是我现在的表格。

CREATE TABLE `login_info` (
    `user_info_id` bigint(100) NOT NULL, 
    `email_id` varchar(45) NOT NULL, 
PRIMARY KEY (`user_info_id`), 
UNIQUE KEY `email_id_UNIQUE` (`email_id`), 
UNIQUE KEY `user_info_id_UNIQUE` (`user_info_id`), 
CONSTRAINT `FK_login_info_user_info` FOREIGN KEY (`user_info_id`) REFERENCES `user_info` (`user_info_id`) ON DELETE CASCADE ON UPDATE CASCADE); 

CREATE TABLE `user_info` (
    `user_info_id` bigint(100) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(50) DEFAULT NULL, 
    `last_name` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`user_info_id`), 
    UNIQUE KEY `user_info_id_UNIQUE` (`user_info_id`)); 

这是我的课怎么看起来像:

的UserInfo:

@Entity 
@Table(name = "user_info") 
public class UserInfo { 

@Id 
@Column(name = "user_info_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer userId; 

@Column(name = "first_name") 
private String firstName; 

@Column(name = "last_name") 
private String lastName; 

@OneToOne(cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private LoginInfo loginInfo; 

//Getters and setters 

LoginInfo类:

@Entity 
@Table(name = "login_info") 
public class LoginInfo { 

@Id 
@Column(name = "user_info_id") 
@GeneratedValue(generator = "generator") 
@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "userInfo")) 
private Integer id; 

@OneToOne 
@PrimaryKeyJoinColumn 
private UserInfo userInfo; 

@Column(name = "email_id") 
private String emailId; 

//Getters and setters 

这是我如何创建和实体保存到表:

UserInfo userInfo = new UserInfo(); 
userInfo.setFirstName(registerUserRequest.getFirstName()); 
userInfo.setLastName(registerUserRequest.getLastName()); 

LoginInfo loginInfo = userInfo.getLoginInfo(); 
if(loginInfo == null) { 
    loginInfo = new LoginInfo(); 
} 
loginInfo.setEmailId(registerUserRequest.getEmailId()); 
loginInfo.setUserInfo(userInfo); 
userInfo.setLoginInfo(loginInfo); 

if(userService.create(userInfo)) { 
    logger.debug("User created successfully"); 
} else { 
    throw new UserAlreadyExistException(); 
} 

在获得此解决方案的过程中,我遇到了大量的休眠异常和问题。这里有一些(如果它可以帮助某人)

Error: identifier of an instance of was altered from 14 to 14 

解决方案:初始时不同类型的实体类的主键。 user_info_id列在UserInfo中声明为Integer,在LoginInfo中声明为long。

Error: attempted to assign id from null one-to-one property 

解决方案:在创建用户信息的对象,我做了 “userInfo.setLoginInfo(LOGININFO)”,但没有设置 “loginInfo.setUserInfo(用户信息)”。修好之后,它很好。

Note: If you see a better way to do the same, please do comment here and let me know. Thanks in advance. 
2

无效关联:@JoinColumn(名称= “EMAILID”,referencedColumnName = “LOGININFO”)

@Entity 
@Table(name="UserInfo") 
public class UserInfo { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer idUserInfo; 
private String firstName; 
private String lastName; 

@OneToOne(mappedBy = "userInfo", cascade = CascadeType.ALL) 
private LoginInfo loginInfo; 


@Entity 
@Table(name="LoginInfo") 
public class LoginInfo { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer idLoginInfo; 

@Column(name="emailId") 
private String emailId; 

//bidirectional one to one association to UserInfo 
@OneToOne 
@PrimaryKeyJoinColumn 
private UserInfo userInfo; 


private String sessionId; 
private String password; 
相关问题