Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 父/子关系的Hibernate注释映射?_Java_Hibernate_Annotations_Mapping - Fatal编程技术网

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

Java 父/子关系的Hibernate注释映射?,java,hibernate,annotations,mapping,Java,Hibernate,Annotations,Mapping,我在映射父母与孩子之间的关系时遇到问题。OneToMany系列的人气非常好。但是,与单个实体相反的实体不存在 我有一个服务器实例表,它是不可变的 当我创建服务器列表时,它会填充服务器分配给它的请求集合,而不会出现问题 当我添加一个新请求,并从下拉列表中选择首选服务器saveOrUpdate(甚至尝试加载和获取)时,它不会填充请求实例中的Server属性 Server.java public class Server { private int serverId; private

我在映射父母与孩子之间的关系时遇到问题。OneToMany系列的人气非常好。但是,与单个实体相反的实体不存在

我有一个服务器实例表,它是不可变的

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

当我添加一个新请求,并从下拉列表中选择首选服务器saveOrUpdate(甚至尝试加载和获取)时,它不会填充请求实例中的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;
    }
}
add.jsp(添加请求表单)

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

现在,当然,我可以从SimpleFormController获取我的请求命令对象,根据用户选择加载服务器对象,并以这种方式保存它——但这不是关系映射的重点,是吗

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


使用:Spring 2.5、Hibernate 3.2.5、Sybase DB

问题在于
请求
是拥有方,因此需要将服务器添加到请求中,即调用
设置服务器()
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;
 }
}

我相信我已经尝试过了,但我会再次尝试。问题是,我希望能够只选择请求,并通过Hibernate映射自动填充服务器属性。因此,服务器\服务器ID外键ID是从请求映射到服务器所必需的(因为服务器对象纯粹用于ORM,而不是数据库中的列)。我不确定我是否理解您的观点,但仅使用服务器就足够了,sinc服务器id的外键无论如何都应该映射到请求表中的列
server\u serverId
。请注意,您可能还希望采用延迟加载,我将相应地更新答案。我使用SimpleFormController实现更新了我的问题。至于您在该实现中的评论:您当然可以使用
serverId
列并分配服务器的id。在这种情况下,您将添加
updateable=false,insertable=false
,最后将两个字段映射到一列。请注意,您还应该能够创建分离的服务器实体,设置id并调用
setServer()
。在这种情况下,您应该确保在保存请求时不会将任何内容级联到服务器。不过,我必须检查第二个问题(或者你可以这样做),所以不要依赖于它。是的,我知道我必须从早期的错误中将可更新和可插入设置为false:org.hibernate.MappingException:Repeated column in mapping for entity:Request column:server\u serverId(应该使用insert=“false”update=“false)映射)我们也将尝试使用分离的服务器,但只希望在更新时填充它。六羟甲基三聚氰胺六甲醚。。。
...

<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>

...
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);
  }
}
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;
 }
}