繁体   English   中英

使用Hibernate无法在Spring MVC中获取多对多映射数据

[英]Unable to get Many-to-Many mapping data in Spring MVC with Hibernate

在引用此Hibernate文档之后
在我的情况下,将“ Person”替换为“ Employee”,将“ Phone”替换为Company,将“ Person_phone”替换为“ EmployeeCompany”。

上面的Hibernate docs示例和我的项目示例之间唯一的区别是黑白。 在Hibernate文档示例中,“ Person_Phone”具有“ phones_Id”作为唯一约束。 而在我的案例中,“ EmployeeCompany”是将“ employeeId”和“ companyId”组合为主键。

基本上我有一个m:n关系的Employee and Company表,这意味着一个雇员可以在多个公司工作,而一个公司可以有多个雇员。

将此m:n关系解析为1:n关系。 我创建了第三个表“ EmployeeCompany”。

使用下面的getEmployees()函数,我想获取所有与Employee相关的公司,因为我在Employee表中使用了@OneToMany注释。

public List<Employee> getEmployees() {
    Session session = this.sessionFactory.getCurrentSession();
    List<Employee> employees = session.createQuery("from Employee").list();
    return employees;
}

它会在“雇员”类中引发与“公司”相关的异常。虽然从“雇员”类中删除“公司”字段可以正常工作,但我没有获得与该雇员相关联的公司数据。

员工模型类:

@Entity
@Table(name = "employee")
public class Employee implements Serializable{
@Id
@GeneratedValue
@Column(name = "employeeId")
private Long employeeId;

@Column(columnDefinition = "text not null")
private String name;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Company> companies = new ArrayList<Company>();

public Long getEmployeeId() {
    return employeeId;
}

public void setEmployeeId(Long employeeId) {
    this.articleId = articleId;
}

public String getName() {
    return heading;
}

public void setName(String name) {
    this.name = name;
}

public List<Company> getCompanies() {
    return companies;
}

public void setCompanies(List<Company> companies) {
    this.companies = companies;
}
}

EmployeeCompany模型类别:

@Entity
@Table(name = "employee_company")
public class EmployeeCompany implements Serializable {

    @EmbeddedId
    private EmployeeCompanyKey key;

    public EmployeeCompanyKey getKey() {
        return key;
    }

    public void setKey(EmployeeCompanyKey key) {
        this.key = key;
    }
}

EmployeeCompanyKey类:

@Embeddable
public class EmployeeCompanyKey implements Serializable{
    @Column(name = "companyId",columnDefinition = "varchar(100) not null")
    private String companyId;

    @Column(name = "employeeId",columnDefinition = "bigint(20) unsigned not null")
    private Long employeeId;


    public String getCompanyId() {
        return companyId;
    }

    public void setCompanyId(String companyId) {
        this.companyId = companyId;
    }

    public Long getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(Long employeeId) {
        this.employeeId = employeeId;
    }


    public int hashCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((companyId == null) ? 0 : companyId.hashCode());
        result = prime * result + employeeId.hashCode();
        return result;
    }


    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        EmployeeCompanyKey other = (EmployeeCompanyKey) obj;
        if (companyId == null) {
            if (other.companyId != null)
                return false;
        } else if (!companyId.equals(other.companyId)){
            return false;
        }
        if (employeeId != other.employeeId)
            return false;
        return true;
    }

}

公司型号类别:

@Entity
@Table(name = "company")
public class Company implements Serializable{

    @Id
    @Column(name = "companyId",columnDefinition = "varchar(100) not null")
    private String companyId;

    @Column(name = "name",columnDefinition = "text not null")
    private String name;

    public String getCompanyId() {
        return companyId;
    }

    public void setCompanyId(String companyId) {
        this.companyId = companyId;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是我制作数据库的SQL查询:

DROP TABLE IF EXISTS `employee`;
CREATE TABLE employee (
`employeeId` bigint(20) unsigned not null auto_increment,
`name` text not null,
primary key(`employeeId`)
)ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;   

DROP TABLE IF EXISTS `employee_company`;
CREATE TABLE employee_company (
`employeeId` bigint(20) unsigned not null,
`companyId` varchar(100) not null,
primary key(`employeeId`,`companyId`),
CONSTRAINT `company_employee_company_fk` FOREIGN KEY (`companyId`) REFERENCES `company`(`companyId`) ON DELETE CASCADE,
CONSTRAINT `employee_employee_company_fk` FOREIGN KEY (`employeeId`) REFERENCES `employee`(`employeeId`) ON DELETE CASCADE
)ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;   


DROP TABLE IF EXISTS `company`;
CREATE TABLE company (
`companyId` varchar(100) not null,
`name` text not null,
primary key(`companyId`)
)ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

请说明我在哪里做错了? 而且,如果我想要公司数据以及所有员工数据,该怎么办?

编辑1:这是我的邮递员响应输出:

    <body>
        <h1>HTTP Status 500 - Could not write content: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;])</h1>
        <HR size="1" noshade="noshade">
        <p>
            <b>type</b> Exception report
        </p>
        <p>
            <b>message</b>
            <u>Could not write content: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;])</u>
        </p>
        <p>
            <b>description</b>
            <u>The server encountered an internal error that prevented it from fulfilling this request.</u>
        </p>
        <p>
            <b>exception</b>
            <pre>org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;])
    org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:238)
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:167)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
</pre>
        </p>
        <p>
            <b>root cause</b>
            <pre>com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-&gt;com.argnv.myproject.Models.Employee[&quot;companies&quot;])
    com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
    com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:184)
    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:605)
    com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:142)
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:100)
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21)
    com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:186)
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:118)
    com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1819)
    org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:231)
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:167)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
</pre>
        </p>
        <p>
            <b>root cause</b>
            <pre>org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.argnv.myproject.Models.Employee.companies, could not initialize proxy - no Session
    org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
    org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
    org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
    org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
    org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
    com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:90)
    com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)
    com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:186)
    com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:569)
    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:597)
    com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:142)
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:100)
    com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21)
    com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:186)
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:118)
    com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1819)
    org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:231)
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:167)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
</pre>
        </p>
        <p>
            <b>note</b>
            <u>The full stack trace of the root cause is available in the Apache Tomcat/7.0.53 logs.</u>
        </p>
        <HR size="1" noshade="noshade">
        <h3>Apache Tomcat/7.0.53</h3>
    </body>

EmployCompanyKey.class

@Embeddable
public class EmployeeCompanyKey implements Serializable{
@Column(name = "companyId",columnDefinition = "varchar(100) not null")
private String companyId;

@Column(name = "companyId",columnDefinition = "bigint(20) unsigned not null")
private Long employeeId;

更改

 @Column(name = "companyId",columnDefinition = "bigint(20) unsigned not null")
private Long employeeId;

@Column(name = "employeeId",columnDefinition = "bigint(20) unsigned not null") private Long employeeId;

然后再试一次 ?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM