所以我有這樣兩類:無法寫入內容:無法懶洋洋地初始化角色的集合使用OpenEntityManagerInViewFilter
樣品
@Entity
@Table(name="sample")
public class Sample implements Serializable {
@Id
@GeneratedValue
@Column(name="sample_id")
private Long sample_id;
@Column(name="id")
private String id;
@Column(name="description")
private String description;
@ManyToOne
@JoinColumn(name="dna_study_id")
private DNA_Study study;
...Getters and setters ...
DNA_Study
@Entity
@Table(name = "dna_study")
public class DNA_Study implements Serializable {
@Id
@GeneratedValue
@Column(name="dna_study_id")
private Long id;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
@Column(name="date")
private Date date;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "dna_study_id")
private List<Sample> samples;
我想從我的數據庫中獲得所有的DNA_Study,有這個DAO:
@Repository
public interface DNA_StudyDAO extends CrudRepository<DNA_Study, Long>{ }
這RestController:
@RestController
public class AnalysisController {
ClassPathXmlApplicationContext context;
@CrossOrigin
@RequestMapping("/getanalysis")
public ArrayList<DNA_Study> getAnalysis() {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
DNA_StudyDAO dao = context.getBean(DNA_StudyDAO.class);
return (ArrayList<DNA_Study>) dao.findAll();
}
,當我把它稱爲我得到 「無法寫入內容:無法懶洋洋地初始化角色集」 我試着修改我的DAO,所以方法findAll()更改爲:
@Override
@Query("select d from DNA_Study d join fetch d.samples")
Iterable<DNA_Study> findAll();
使用t他沒有例外被拋出,但調用方法創建了一個無限循環,因爲創建一個DNA_Study意味着加載它的樣本,每個樣本加載它的DNA_Study等,以便它打破。所以,我想我需要添加一個OpenEntityManagerInViewFilter和撤消覆蓋到的findAll(),嘗試添加到我的SpringBootServletInitializer類:
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(Application.class);
rootContext.setServletContext(servletContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
FilterRegistration.Dynamic filter = servletContext.addFilter("openEntityManagerInViewFilter", OpenEntityManagerInViewFilter.class);
filter.setInitParameter("singleSession", "true");
filter.addMappingForServletNames(null, true, "dispatcher");
servletContext.addListener(new ContextLoaderListener(rootContext));
}
但是,當我打這個電話,我仍然得到「未能懶洋洋地初始化角色集合「
我應該如何正確添加OpenEntityManagerInViewFilter?
擴展 SpringBootServletInitializer編輯
類:
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(GemDomusServerApplication.class);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(Application.class);
rootContext.setServletContext(servletContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
FilterRegistration.Dynamic filter = servletContext.addFilter("openEntityManagerInViewFilter", OpenEntityManagerInViewFilter.class);
filter.setInitParameter("singleSession", "true");
filter.setInitParameter("entityManagerFactoryBeanName", "entityManagerFactory");
filter.setInitParameter("flushMode", "auto");
filter.addMappingForServletNames(null, true, "dispatcher");
servletContext.addListener(new ContextLoaderListener(rootContext));
servletContext.addListener(new RequestContextListener());
}
public static void main(String[] args) {
SpringApplication.run(GemDomusServerApplication.class, args);
}
applicationContext.xml的豆類參與
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="jpaData" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.postgresql.Driver</value>
</property>
<property name="url">
<value>**</value>
</property>
<property name="username">
<value>**</value>
</property>
<property name="password">
<value>**</value>
</property>
</bean>
周
的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="jpaData"/>
</persistence>
因此,我應該調用findAll()並遍歷任何元素與Hiebernate.initialize(Object)? – Dexter
此查詢應該足以強制EAGER獲取您的樣本集合「從DNA_Study d join fetch d.sampl中選擇d es「,但如果這不起作用,您可以通過迭代對象並調用Hibernate.initialize –
來強制執行此操作。但我需要的是惰性初始化。在鏈接中他們添加了一個過濾器,我也沒有工作。 – Dexter