【问题标题】:Hibernate correct cascade mappingHibernate 正确的级联映射
【发布时间】:2017-05-15 15:57:50
【问题描述】:

我是 hibernate 的新手,我设法让它与一些表和外键一起工作,但我需要保存 java 对象的层次结构,我不知道最好的方法。我会像这样简化我的问题

请求可能产生 0..* 响应

一个 Response 与 1 个 Request

相关联

一个Response也有2个ResponseDetail对象

一个 ResponseDetail 与 1 个 Response

相关联
Class Request{
 @Id
 int reqId;
}

Class Response
{
 @Id
 int respId;

 @OneToOne(fetch=FetchType.LAZY)
 @JoinColumn(name = "reqId")
 Request req; //foreign key from request
 ResponseDetail rd1;
 ResponseDetail rd2;
}


Class ResponseDetail{
 ???
 int rdId;
 other stuff...
}

现在java端我会得到一些响应,手动设置他们的请求对象,我需要保存这个响应并自动让hibernate保存ResponseDetail rd1和rd2,老实说我不知道​​如何继续。

理想情况下,我需要一种在某些响应上使用休眠的保存方法的方法,它会自动将 ResponseDetail 保存在数据库中并在 rd1 和 rd2 字段中设置引用

我应该使用什么映射?如何正确达到我的目标?

【问题讨论】:

    标签: java postgresql hibernate persistence


    【解决方案1】:
    @Entity
    class Request
    {
       @OneToMany(mapped-by="request", cascade=CascadeType.ALL)
       public List<Response> getResponses()
       // implementation    
    
    }
    
    @Entity
    class Response 
    {
       @OneToOne
       @JoinColumn(name="request_id")
       public Request getRequest()
       // implementation
    }
    

    在保存之前,在您的服务部分,您应该为所有子对象设置父对象(本例中的请求)。

    for(Resposne res:request.getResponses(){ 
        res.setRequest(request);
    }
    yourService.save(request);
    

    【讨论】:

    • 即使我没有完成,我缺少的注释 JoinColumn 也有帮助。我尝试了类似的事情但没有成功,因为我还需要在 json 中序列化 Request 并且它产生了循环。所以我试图删除响应中的请求字段并强制一个id,但是当我保存请求时,我的响应字段(在请求中)违反了唯一标识符约束,我想我必须研究更多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多