【发布时间】:2017-09-26 06:25:17
【问题描述】:
在引用此Hibernate docs 之后。
在我的例子中,将“Person”替换为“Employee”,将“Phone”替换为 Company,将“Person_phone”替换为“EmployeeCompany”。
以上 Hibernate 文档示例和我的项目示例的唯一区别。 在 Hibernate 文档示例中,“Person_Phone”将“phones_Id”作为唯一约束。 而在我的“EmployeeCompany”案例中,我将“employeeId”和“companyId”组合为主键。
基本上我有一个包含 m:n 关系的 Employee 和 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;
}
它在“Employee”类中抛出与“companies”相关的异常。虽然从“Employee”类中删除“companies”字段工作正常,但我没有获取与 Employee 关联的公司数据。
员工模型类:
@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]->com.argnv.myproject.Models.Employee["companies"]); 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]->com.argnv.myproject.Models.Employee["companies"])</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]->com.argnv.myproject.Models.Employee["companies"]); 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]->com.argnv.myproject.Models.Employee["companies"])</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]->com.argnv.myproject.Models.Employee["companies"]); 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]->com.argnv.myproject.Models.Employee["companies"])
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]->com.argnv.myproject.Models.Employee["companies"])
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>
【问题讨论】:
-
如果您收到错误消息,请在此处发布原始消息,而不是
related with "companies" in "Employee" Class.
标签: java hibernate spring-mvc