发布于2021-06-07 11:52 阅读(1133) 评论(0) 点赞(29) 收藏(0)
我在将 ManyToOne 从父级关系映射到子级关系时遇到问题。OneToMany 集合可以懒惰地填充。但是,与单个实体相反,则不是。
我有一个服务器实例表,它是不可变的。
当我创建服务器列表时,它会毫无问题地填充服务器分配给它的请求集合。
当我添加一个新请求,并从下拉列表中选择首选服务器时,saveOrUpdate(甚至尝试加载和获取)它不会填充请求实例中的服务器属性。
服务器端.java
public class Server {
private int serverId;
private List<Request> requests;
...
@OneToMany(mappedBy="server", fetch=FetchType.LAZY)
public List<Request> getRequests() {
return requests;
}
}
请求.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>
...
添加请求控制器.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()
。该server
字段是负责数据库中相应列的字段。
将请求添加到列表中是不够的,因为这只是逆映射。如果您在请求中设置服务器,然后从数据库重新加载服务器,则请求应自动添加到列表中(尽管您通常不会这样做,但也会手动将服务器添加到列表中)。
因此,请求应如下所示:
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;
}
}
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/218616/2a9b15a79e9da7144cc9/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!