2011-10-24 141 views
0

我想实现一个简单的连接操作与我的两个表,使用spring3 mvc休眠3注释。休眠注释连接问题

我有两个表:

员工

CREATE TABLE IF NOT EXISTS `employee` (`enter code here` 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `address1` varchar(100) NOT NULL, 
    `address2` varchar(100) NOT NULL, 
    `created_at` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB 

工资

CREATE TABLE IF NOT EXISTS `salary` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `employee_id` int(11) NOT NULL, 
    `basic_pay` int(5) NOT NULL, 
    `take_home` int(5) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `employee_id` (`employee_id`) 
) ENGINE=InnoDB 

我已经创建了两个注解模式类:

Employee.java

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

    private Integer id; 
    private String name; 
    private String address1; 
    private String address2; 
    private Date createdAt; 
    private Set salaries = new HashSet(0); 

    public Employee() { 
    } 

    public Employee(String name, String address1, String address2, 
      Date createdAt) { 
     this.name = name; 
     this.address1 = address1; 
     this.address2 = address2; 
     this.createdAt = createdAt; 
    } 

    public Employee(String name, String address1, String address2, 
      Date createdAt, Set salaries) { 
     this.name = name; 
     this.address1 = address1; 
     this.address2 = address2; 
     this.createdAt = createdAt; 
     this.salaries = salaries; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

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

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

    @Column(name = "address1", nullable = false, length = 100) 
    public String getAddress1() { 
     return this.address1; 
    } 

    public void setAddress1(String address1) { 
     this.address1 = address1; 
    } 

    @Column(name = "address2", nullable = false, length = 100) 
    public String getAddress2() { 
     return this.address2; 
    } 

    public void setAddress2(String address2) { 
     this.address2 = address2; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "created_at", nullable = false, length = 0) 
    public Date getCreatedAt() { 
     return this.createdAt; 
    } 

    public void setCreatedAt(Date createdAt) { 
     this.createdAt = createdAt; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") 
    public Set getSalaries() { 
     return this.salaries; 
    } 

    public void setSalaries(Set salaries) { 
     this.salaries = salaries; 
    } 

Salary.java

@Entity 
@Table(name = "salary", catalog = "employee") 
public class Salary implements java.io.Serializable { 

    private Integer id; 
    private Employee employee; 
    private int basicPay; 
    private int takeHome; 

    public Salary() { 
    } 

    public Salary(Employee employee, int basicPay, int takeHome) { 
     this.employee = employee; 
     this.basicPay = basicPay; 
     this.takeHome = takeHome; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

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

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

    @Column(name = "basic_pay", nullable = false) 
    public int getBasicPay() { 
     return this.basicPay; 
    } 

    public void setBasicPay(int basicPay) { 
     this.basicPay = basicPay; 
    } 

    @Column(name = "take_home", nullable = false) 
    public int getTakeHome() { 
     return this.takeHome; 
    } 

    public void setTakeHome(int takeHome) { 
     this.takeHome = takeHome; 
    } 

当我打开一个网页,我得到以下错误

org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: 
Invocation of init method failed; nested exception is org.hibernate.MappingException: 
Could not determine type for: java.util.Set, at table: EMPLOYEE, for columns: 
[org.hibernate.mapping.Column(salaries)] 

什么不对我的情态类

帮助非常感谢,谢谢 , VKS

回答

1

我不是专家,但dnt我们需要告诉hibernate应该是什么类型的SET。因为在这种情况下,在我看来,我们正在告诉hibernate SET代表一对多关系,但是用哪个表?

在* .hbm.xml映射文件中,我猜测“table”属性用于此目的。

例如

<set cascade="persist, merge, save-update, evict, replicate, lock, refresh" name="Salaries" inverse="true" lazy="true" table="salary"> 
      <key> 
       //code goes here 
      </key> 
      <one-to-many class="Salary" /> 
     </set> 
2

你的工资Set是原始类型,Hibernate不知道如何“地图”将其与一个实体。 尝试将targetEntity添加到您的@oneToMany或使用Set<Salary>

+0

从我+1是如此没有激励去通过这个问题。 – Shahzeb

+0

+1:使用套装