Hibernate Tools无法检测一对一关系

时间:2011-07-17 12:54:06

标签: hibernate hibernate-mapping

我正在尝试使用Eclipse中的Hibernate Tools(Annotations)从MySQL数据库生成实体类。但是,我在生成一对一关系代码时遇到了麻烦。我的MySQL表目前正在确保这种关系,但Hibernate工具却没有检测到它......

“用户与完全一名员工相关联”

这是我的表的代码..用户第一

CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(45) NOT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`role_id` int(11) NOT NULL,
`emp_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `employee_emp_id_UNIQUE` (`emp_id`),
KEY `fk_user_role` (`role_id`),
KEY `fk_user_employee1` (`emp_id`),
CONSTRAINT `fk_user_role` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`) ON
DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_user_employee1` FOREIGN KEY (`emp_id`) REFERENCES `employee` (`emp_id`)
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

员工第二

CREATE TABLE `employee` (
`emp_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`address` varchar(45) DEFAULT NULL,
`CNIC` varchar(15) DEFAULT NULL,
`hourly_rate` int(11) NOT NULL,
`is_allowed` tinyint(1) NOT NULL DEFAULT '0',
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`code` varchar(5) NOT NULL,
PRIMARY KEY (`emp_id`),
UNIQUE KEY `code_UNIQUE` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

生成的代码是一对多......

对于用户类

@Entity
@Table(name = "user", catalog = "ieeepi_pharmacy", uniqueConstraints =
@UniqueConstraint(columnNames = "emp_id"))
public class User implements java.io.Serializable {

private int userId;
private Role role;
private Employee employee;
private String username;
private String password;
private boolean isActive;

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id", unique = true, nullable = false)
public int getUserId() {
    return this.userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", nullable = false)
public Role getRole() {
    return this.role;
}

public void setRole(Role role) {
    this.role = role;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "emp_id", unique = true, nullable = false)
public Employee getEmployee() {
    return this.employee;
}

public void setEmployee(Employee employee) {
    this.employee = employee;
}

@Column(name = "username", nullable = false, length = 20)
public String getUsername() {
    return this.username;
}

public void setUsername(String username) {
    this.username = username;
}

@Column(name = "password", nullable = false, length = 45)
public String getPassword() {
    return this.password;
}

public void setPassword(String password) {
    this.password = password;
}

@Column(name = "is_active", nullable = false)
public boolean isIsActive() {
    return this.isActive;
}

public void setIsActive(boolean isActive) {
    this.isActive = isActive;
}

}

对于员工..

@Entity
@Table(name = "employee", catalog = "ieeepi_pharmacy", uniqueConstraints = 
@UniqueConstraint(columnNames = "code"))
public class Employee implements java.io.Serializable {

private int empId;
private String name;
private String address;
private String cnic;
private int hourlyRate;
private boolean isAllowed;
private boolean isActive;
private String code;
private Set<User> users = new HashSet<User>(0);
private Set<Attendance> attendances = new HashSet<Attendance>(0);

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "emp_id", unique = true, nullable = false)
public int getEmpId() {
    return this.empId;
}

public void setEmpId(int empId) {
    this.empId = empId;
}

@Column(name = "name", nullable = false, length = 45)
public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name = "address", length = 45)
public String getAddress() {
    return this.address;
}

public void setAddress(String address) {
    this.address = address;
}

@Column(name = "CNIC", length = 15)
public String getCnic() {
    return this.cnic;
}

public void setCnic(String cnic) {
    this.cnic = cnic;
}

@Column(name = "hourly_rate", nullable = false)
public int getHourlyRate() {
    return this.hourlyRate;
}

public void setHourlyRate(int hourlyRate) {
    this.hourlyRate = hourlyRate;
}

@Column(name = "is_allowed", nullable = false)
public boolean isIsAllowed() {
    return this.isAllowed;
}

public void setIsAllowed(boolean isAllowed) {
    this.isAllowed = isAllowed;
}

@Column(name = "is_active", nullable = false)
public boolean isIsActive() {
    return this.isActive;
}

public void setIsActive(boolean isActive) {
    this.isActive = isActive;
}

@Column(name = "code", unique = true, nullable = false, length = 5)
public String getCode() {
    return this.code;
}

public void setCode(String code) {
    this.code = code;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
public Set<User> getUsers() {
    return this.users;
}

public void setUsers(Set<User> users) {
    this.users = users;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
public Set<Attendance> getAttendances() {
    return this.attendances;
}

public void setAttendances(Set<Attendance> attendances) {
    this.attendances = attendances;
}

}

你看到的结果是一对多...我还检查了“检测一对一关联”选项无效...... :(

2 个答案:

答案 0 :(得分:1)

解决问题的关键是将父表的外键设置为子项的主键。

答案 1 :(得分:0)

自提出问题以来已经过去了很多时间,但我想提一个问题。 我有类似的数据库关系,但区别在于我有employeesfield employees3rd party employees,在我的结构中,这三个都users。 因此,我计划创建一个userId字段,该字段具有users表的PK的外键,而不是上面问题中实现的反向(emp_id 表中的users这是一个稍微不同的情况。 哪种方法更适合这种结构。

而且我也找不到解决usersemployeesfield employees3rd party employees之间一对一关系的解决方案。