【问题标题】:Error on Many to one relationship in hibernate休眠中多对一关系的错误
【发布时间】:2018-05-18 10:55:17
【问题描述】:

在这里,我想在公司 @One to many(employee) 之间建立关系 和员工@多对一(公司) 以及@Employee(person) 和 Address(Persondetail) 之间的一对一关系。

执行 My MAIN CLASS 时遇到以下错误

** 解决这个错误,让我编写代码来打印关于 Employee(person) 的所有数据,包括其他两个表记录**

信息:HHH000400:使用方言:org.hibernate.dialect.MySQL5Dialect 线程“主”org.hibernate.MappingException 中的异常:无法确定类型:Rajat.Practice1.Company,在表:Person,对于 列:[org.hibernate.mapping.Column(company)] 在 org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336) 在 org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310) 在 org.hibernate.mapping.Property.isValid(Property.java:241) 在 org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:496) 在 org.hibernate.mapping.RootClass.validate(RootClass.java:270) 在 org.hibernate.cfg.Configuration.validate(Configuration.java:1358) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928) 在 Rajat.Practice1.Main.main(Main.java:21)

((主类))

package Rajat.Practice1;

    import javax.imageio.spi.ServiceRegistry;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.hibernate.tool.hbm2ddl.SchemaExport;

    public class Main {


        public static void main(String[] args) {

             Configuration cfg=new Configuration();  
                cfg.configure("hibernate.cfg.xml");  

                SessionFactory sf=cfg.buildSessionFactory();  
                Session session=sf.openSession();  
                Transaction tx=session.beginTransaction();  

                PersonDetail pd=new  PersonDetail();
                pd.setCity("jaipur");
                pd.setState("jaipur");

                Company c=new Company();
                c.setC_name("Protechgenie");


            Person p=new Person();
            p.setName("Rajat");

            Person p1=new Person();
            p1.setName("Dynamo");

            p.setCompany(c);
            p1.setCompany(c);



            p.setP_detail(pd);

            session.save(c);
            session.save(p);
            session.save(p1);

            session.getTransaction().commit();

        }

    }

公司类

    package Rajat.Practice1;

    import java.util.List;

    import javax.persistence.Column;
    import javax.persistence.ElementCollection;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;

    @Entity
    @Table(name="company")
    public class Company {

        @Id
        @GeneratedValue
        @Column(name="c_id")
        private int c_id;
        private String C_name;
        @ElementCollection(targetClass=Person.class)
        private List <Person> person;

        @OneToMany(targetEntity=Person.class, mappedBy="person" , cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.EAGER)
        public List<Person> getPerson() {
            return person;
        }
        public void setPerson(List<Person> person) {
            this.person = person;
        }
        public int getC_id() {
            return c_id;
        }
        public void setC_id(int c_id) {
            this.c_id = c_id;
        }
        public String getC_name() {
            return C_name;
        }
        public void setC_name(String c_name) {
            C_name = c_name;
        }


    }

EMPLOYEE(人)类

    package Rajat.Practice1;

    import javax.persistence.Column;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;

    import org.hibernate.annotations.CascadeType;
    import org.hibernate.annotations.CollectionId;
    import javax.persistence.Entity;
    import org.hibernate.annotations.Fetch;

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


        @Id
        @GeneratedValue
        @Column(name="Pid_pk")

        private int Pid;



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

        @Column(name="company")
        private Company company;





        @OneToOne ( cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.EAGER  )
        @JoinColumn(name="pdetail_fk")
        private PersonDetail p_detail;


        public PersonDetail getP_detail() {
            return p_detail;
        }
        public void setP_detail(PersonDetail p_detail) {
            this.p_detail = p_detail;
        }



        public int getPid() {
            return Pid;
        }
        public void setPid(int pid) {
            Pid = pid;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }


        @ManyToOne
        @JoinColumn(name="c_id")
        public Company getCompany() {
            return company;
        }
        public void setCompany(Company company) {
            this.company = company;
        }



    }

员工地址(人员详细信息类)`

    package Rajat.Practice1;

    import javax.persistence.Column;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;


    @Entity
    @Table(name="pdetail")
    public class PersonDetail {

        @Id
        @GeneratedValue
        @Column(name="pid_pk")
        private int p_id;


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


        @Column(name="state")
        private String State;



        public String getCity() {
            return City;
        }
        public void setCity(String city) {
            City = city;
        }
        public String getState() {
            return State;
        }
        public void setState(String state) {
            State = state;
        }

    }

【问题讨论】:

标签: hibernate hibernate-mapping


【解决方案1】:

我尝试一一纠正以下是解决问题的类定义

@Entity
public class Company {

    private int c_id;
    private String name;
    //@ElementCollection(targetClass=Person.class)

    private List<Person> person = new ArrayList<Person>();


    @OneToMany(mappedBy="company",fetch = FetchType.LAZY)
    public List<Person> getPerson() {
        return person;
    }
    public void setPerson(List<Person> person) {
        this.person = person;
    }
    @Id
    @GeneratedValue
    @Column(name="c_id")
    public int getc_id() {
        return c_id;
    }
    public void setc_id(int c_id) {
        this.c_id = c_id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

人物类

@Entity
public class Person {

    private int Pid;

    private String name;

    private Company company;

    private PersonDetail p_detail;

    @OneToOne ( cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.EAGER  )
    @JoinColumn(name="pdetail_pk")
    public PersonDetail getP_detail() {
        return p_detail;
    }
    public void setP_detail(PersonDetail p_detail) {
        this.p_detail = p_detail;
    }

    @Id
    @GeneratedValue
    @Column(name="Pid_pk")
    public int getPid() {
        return Pid;
    }
    public void setPid(int pid) {
        Pid = pid;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="c_id", nullable = false)
    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

}

PersonDetail 类

@Entity
@Table(name="pdetail")
public class PersonDetail {

    @Id
    @GeneratedValue
    @Column(name="pdetail_pk")
    private int p_id;


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


    @Column(name="state")
    private String State;



    public String getCity() {
        return City;
    }
    public void setCity(String city) {
        City = city;
    }
    public String getState() {
        return State;
    }
    public void setState(String state) {
        State = state;
    }

}

【讨论】:

  • 非常感谢您先生,因为我照原样复制了您的代码,但是
  • 出现错误---原因:java.sql.SQLException: Field 'c_id' doesn't have a default value
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2019-12-17
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多