加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 父/子关系的Hibernate注释映射?

发布时间:2020-12-15 02:25:12 所属栏目:Java 来源:网络整理
导读:我在将ManyToOne从Parent转换为Child关系时遇到了问题. OneToMany系列懒洋洋地填充.但是,与单个实体相反,则不然. 我有一个Server实例表,它是不可变的. 当我创建服务器列表时,它会填充服务器已分配给它的请求集合而不会出现问题. 当我添加一个新请求,并从下拉
我在将ManyToOne从Parent转换为Child关系时遇到了问题. OneToMany系列懒洋洋地填充.但是,与单个实体相反,则不然.

我有一个Server实例表,它是不可变的.

当我创建服务器列表时,它会填充服务器已分配给它的请求集合而不会出现问题.

当我添加一个新请求,并从下拉列表中选择服务器首选,saveOrUpdate,(甚至尝试加载和获取)时,它不会填充Request实例中的Server属性.

Server.java

public class Server {

    private int serverId;
    private List<Request> requests;
    ...
    @OneToMany(mappedBy="server",fetch=FetchType.LAZY)
    public List<Request> getRequests() {
      return requests;
    }
}

Request.java

public class Request {

    private int requestId;
    private int server_serverId; // foreign key to Server.serverId
    private Server server;
    ...
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="server_serverId",nullable=false,updatable=false,insertable=false}
    @ForeignKey(name="server_serverId",inverseName="serverId") // Don't think this really does anything
    public Server getServer() {
      return server;
    }
}

add.jsp(添加申请表)

...

<form:select id="preferred-server" path="server.serverId">
    <c:forEach items="${servers}" var="server">
        <form:option value="${server.serverId}">${server.serverName}</form:option>
    </c:forEach>
</form:select>

...

AddRequestController.java

public class AddRequestController extends SimpleFormController {
  ...
  @Override
  protected ModelAndView onSubmit(Object command) throws Exception {

    Request request = (Request)command;

    try {
        logger.info("BEFORE SAVE,request.server = " + request.getServer());
    } catch (NullPointerException npe) {
        logger.error("onSubmit() caught NPE: " + npe);
    }

    // Would rather not do these next two lines.  Would prefer to saveOrUpdate
    // Request,and have it populate server property via server_serverId foreign key.
    //Server server = serverDao.loadByServerId(request.getServer_serverId());
    //request.setServer(server);
    //Added this instead,which calls getHibernateTemplate().refresh(server,LockMode.READ)
    serverDao.refreshServer(request.getServer());

    requestDao.addRequest(request); // calls getHibernateTemplate.saveOrUpdate(request)

    try {
        logger.info("AFTER SAVE,request.server = " + request.getServer());
    } catch (NullPointerException npe) {
        logger.error("onSubmit() caught NPE: " + npe);
    }        

    return new ModelAndView(getSuccessView(),"request",request);
  }
}

我已经尝试了几乎我可以在网上找到的注释映射的每个组合,这是用于获取请求集合的设置.

现在,当然,我可以从SimpleFormController获取我的Request命令对象,根据用户选择的内容加载Server对象,并以这种方式持久化 – 但这不是关系映射的关键,现在是吗?

有什么建议?如果您需要任何其他代码,请告诉我.

使用:Spring 2.5,Hibernate 3.2.5,Sybase DB

解决方法

问题是Request是拥有方,因此您需要将服务器添加到请求中,即调用setServer().服务器字段是负责数据库中相应列的服务器字段.

将请求添加到列表是不够的,因为这只是逆映射.如果您在请求中设置服务器,然后从数据库重新加载服务器,请求应自动添加到列表中(尽管您通常不会这样做,但也可以手动将服务器添加到列表中).

因此,请求应如下所示:

public class Request {

 private int requestId;
 //I don't see any need for this
 //private int server_serverId; // foreign key to Server.serverId
 private Server server;
 ...
 @ManyToOne ( fetch=FetchType.LAZY ) //employ lazy loading,you can put that on @OneToMany too
 @JoinColumn( name="server_serverId",nullable=false }
 public Server getServer() {
  return server;
 }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读