Java 关于使用Hibernate将对象映射到数据库

Java 关于使用Hibernate将对象映射到数据库,java,hibernate,oracle11g,annotations,persistence,Java,Hibernate,Oracle11g,Annotations,Persistence,大家好,我刚开始冬眠。当我浏览与hibernate相关的主题时,我发现了这个 在阅读了解决方案之后,我有点困惑,开始构建确切的场景,以了解多对一背后的实际机制,在这里我使用了oracle 11g数据库。当我运行我的项目时,hibernate会自动生成表和FK关系,但在插入数据时,它会面临这个问题(这是显而易见的) 我所做的正是我所提到的上述主题的解决方案,我正在发布我的实体类,请帮助我解决这个问题 班级作业 @Entity @Table(name="JOB") public class Job

大家好,我刚开始冬眠。当我浏览与hibernate相关的主题时,我发现了这个

在阅读了解决方案之后,我有点困惑,开始构建确切的场景,以了解多对一背后的实际机制,在这里我使用了oracle 11g数据库。当我运行我的项目时,hibernate会自动生成表和FK关系,但在插入数据时,它会面临这个问题(这是显而易见的)

我所做的正是我所提到的上述主题的解决方案,我正在发布我的实体类,请帮助我解决这个问题

班级作业

@Entity
@Table(name="JOB")
public class Job implements Serializable {
    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="JOB_SERIAL")
    private int id;

    @Column(name="JOB_CATAGORY",nullable=false,length=200,unique=true)
    private String catagory;


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn (name="JOB_AUTHID", nullable = false, updatable = false, insertable = false)
    private Authorization authorization;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn (name="JOB_JOBFILTERID", nullable = false, updatable = false, insertable = false)
    private JobFilteration jobfilteration;
班级作业筛选

@Entity
@Table(name="JOB_FILTERATION")
public class JobFilteration implements Serializable {
    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="FILTER_SERIAL")
    private int id;

    @Column(name="FILTERNAME",nullable=false,length=200)
    private String filtername;
@Entity
@Table(name="AUTHORIZATION")
public class Authorization implements Serializable {
    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="AUTH_ID")
    private int id;

    @Column(name="AUTHORISEDBY",nullable=false,length=200)
    private String authorisedby;
类别授权

@Entity
@Table(name="JOB_FILTERATION")
public class JobFilteration implements Serializable {
    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="FILTER_SERIAL")
    private int id;

    @Column(name="FILTERNAME",nullable=false,length=200)
    private String filtername;
@Entity
@Table(name="AUTHORIZATION")
public class Authorization implements Serializable {
    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="AUTH_ID")
    private int id;

    @Column(name="AUTHORISEDBY",nullable=false,length=200)
    private String authorisedby;
为了插入数据,我编写了一个方法
public void insertToDB(Job Job)
(我对三个类使用相同的顺序以节省时间),然后

JoBDao jobdao= new JoBDao();
Job job= null;
Authorization auth = null;
JobFilteration jfilter = null;

try{
job= new Job();

auth = new Authorization();
    auth.setAuthorisedby("SOMEPERSON");

jfilter = new JobFilteration();
    jfilter.setFiltername("JEE");

job.setCatagory("PERMANENT");
job.setAuthorization(auth);
job.setJobfilteration(jfilter);


jobdao.addPersonandCard(job);

我认为发生异常是因为数据在插入其他表之前插入到作业表中。请帮我找出我遗漏了什么?

查看要存储的对象。您试图保存的对象似乎具有不接受空值的字段的空值。根据您的代码,所有DB列都不能为空。这意味着您不能为这些列输入空值

首先尝试保存从属实体(在您的情况下是授权),然后尝试保存外部实体(作业)


因为主类中有两个实体,所以需要先保存,然后在包含它们的主类中设置实体。恐怕我真的记不起是sessession.save还是session.saveOrUpdate函数返回bean了,但是使用该方法,使用BeanUTils.copy方法并将bean设置在主类中,一旦所有实体都是dne,则保存或更新主实体类


希望这有帮助

最后,我已经解决了与job类相关的问题,其余的代码(类)都没有问题。在这里,我粘贴正确的和修改过的作业实体

@Entity
@Table(name="JOB")
public class Job implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id 
    @SequenceGenerator(name="person_seq", sequenceName="SEQ_PERSON",initialValue=1,allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="person_seq")
    @Column(name="JOB_SERIAL")
    private int id;

    @Column(name="JOB_CATAGORY",nullable=false,length=200,unique=true)
    private String catagory;


    /*   The problem was inside this block */


    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn (name="JOB_AUTHID", nullable = false)
    private Authorization authorization;                                 

    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn (name="JOB_JOBFILTERID", nullable = false)
    private JobFilteration jobfilteration;

不,我的观点是,我上面提到的线程不正确,或者我做错了什么,我只是想知道我在这里遗漏了什么?我猜注释没有什么问题,但是如果你将实体设置为不可空,那么当你试图只保存主实体时,就会抛出错误,因为hibernate会尝试检查相应的条目(与FK关联的条目)是否存在,并且因为它是nt定义的,或者可能是nt先保存的,id wud of cz应该是空的,所以我猜是错误的。@Rat-a-tat-a-tatratotouille:您可以通过一些代码片段详细说明如何在保存主实体之前保存相应的实体。我面临着类似的问题,而且我有双向映射。为此,我必须在授权实体中使用manytoone,对吗?我明白了异常的原因,我在这篇文章中已经提到过,但我的问题是,为什么即使我们使用manytoone关系,也忘了三个表,让我们只讨论两个表或两个实体类我们做同样的事,对吗?那么我的代码有什么问题呢?jobdao.addPersonandCard(job);在此之前,请尝试保存auth和jfilter对象并保存作业,否则请尝试添加cacade多对一注释@Manytone(fetch=FetchType.LAZY,cascade=CascadeType.all)ramesh你说的有一部分是对的,事实上我已经解决了问题,你没有放置cascade=CascadeType.all是原因之一在例外的后面我已经填写了所有的值,现在我已经提交了所有的类,请看一看