java - Hibernate - 将 : Could not determine type for #, 映射到表 : #, 的列:#

标签 java database hibernate mapping hibernate-mapping

我尝试了所有方法,但还是卡住了。 你能帮我一下吗?

这个小项目只是对大型数据库的初步测试。我只使用 Hibernate 一周,稍后我将尝试将其全部与 Srping MVC Tomcat 连接起来。

但现在我只想能够识别映射中的错误。

控制台:

    `Initial SessionFactory creation failed.org.hibernate.MappingException: Could not determine type for: hiber.data_examplecompany.Address, at table: EMPLOYEE, for columns: [org.hibernate.mapping.Column(address)]
Exception in thread "main" java.lang.ExceptionInInitializerError
    at tools.hiber.HiberUtil.<clinit>(HiberUtil.java:19)
    at tools.hiber.HiberSave.main(HiberSave.java:15)
Caused by: org.hibernate.MappingException: Could not determine type for: hiber.data_examplecompany.Address, at table: EMPLOYEE, for columns: [org.hibernate.mapping.Column(address)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:486)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:453)
    at org.hibernate.mapping.Property.isValid(Property.java:226)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:624)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:347)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:466)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at tools.hiber.HiberUtil.<clinit>(HiberUtil.java:15)
    ... 1 more

Employee.java:

package hiber.data_examplecompany;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity
@Table(name = "EMPLOYEE")
@Access(value=AccessType.FIELD)
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emp_id")
    private long id;
    @Column(name = "emp_name")
    private String name;
    @Column(name = "emp_salary")
    private double salary;

    private Address address;

    public long getId() {
        return id;
    }

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

    @OneToOne(mappedBy = "employee")
    @Cascade(value = org.hibernate.annotations.CascadeType.ALL)
    public Address getAddress() {
        return address;
    }

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

    @Column(name = "emp_name")
    public String getName() {
        System.out.println("Employee getName called");
        return name;
    }

    public void setName(String name) {
        System.out.println("Employee setName called");
        this.name = name;
    }

    @Column(name = "emp_salary")
    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Id= " + id + ", Name= " + name + ", Salary= " + salary
                + ", {Address= " + address + "}";
    }

}

地址.java:

package hiber.data_examplecompany;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
@Table(name = "ADDRESS")
@Access(value=AccessType.FIELD)
public class Address {

    @Id
    @Column(name = "emp_id", unique = true, nullable = false)
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name = "property", value = "employee") })
    private long id;

    @Column(name = "address_line1")
    private String addressLine1;

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

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

    @OneToOne
    @PrimaryKeyJoinColumn
    private Employee employee;

    public long getId() {
        return id;
    }

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

    public String getAddressLine1() {
        return addressLine1;
    }

    public void setAddressLine1(String addressLine1) {
        this.addressLine1 = addressLine1;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Employee getEmployee() {
        return employee;
    }

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

    @Override
    public String toString() {
        return "AddressLine1= " + addressLine1 + ", City=" + city
                + ", Zipcode=" + zipcode;
    }
}

谢谢 为了投入的时间! :)

最佳答案

实际上,你的映射没问题。每个员工可以有一个地址。但我认为你犯了一个小错误。据我所知,每当使用注释在 hibernate 中创建表时,都会在一个地方使用所有注释,我的意思是字段或属性级别。基本上,Hibernate 会根据 @Id 注释位置查找其他所需的注释。因此,在您的情况下, @Id 位于 Employee 表中的字段级别,而 @OneToOne 位于 Employee 表中的属性级别。请进行相同的更改并重试,请告诉我。

@Entity
@Table(name = "EMPLOYEE")
@Access(value=AccessType.FIELD)
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emp_id")
    private long id;
    @Column(name = "emp_name")
    private String name;
    @Column(name = "emp_salary")
    private double salary;

     @OneToOne(mappedBy = "employee" , cascade = CascadeType.ALL)   
    private Address address;

    public long getId() {
        return id;
    }

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


    public Address getAddress() {
        return address;
    }

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


    public String getName() {
        System.out.println("Employee getName called");
        return name;
    }

    public void setName(String name) {
        System.out.println("Employee setName called");
        this.name = name;
    }


    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Id= " + id + ", Name= " + name + ", Salary= " + salary
                + ", {Address= " + address + "}";
    }

关于java - Hibernate - 将 : Could not determine type for #, 映射到表 : #, 的列:#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52220913/

相关文章:

java - Android 是否为 DatagramSocket 排队 UDP 数据包?

MySQL:在 MySQL 中存储全年(365 个元素)的最高效方法是什么?

android - android DBAdapter 类错误

java:结果集迭代与列表迭代:是否存在性能差异

java - 即使在安装 Bouncy CaSTLe 提供程序后,TLSv1.2 SSLContext 也不可用错误

java - 到目前为止解析字符串似乎是错误的

java - 如何将导致异常的方法的错误消息传递给监听器中的 onTestFailure 方法

database - 如何在 Google App Engine 中创建数据库表

eclipse - 如何为 Hibernate - Eclipse Dali JPA 集成指定运行时提供的库

java - MYSQL Hibernate 5.2 createStoredProcedureQuery