我正在增强一个旧的Spring/Hibernate应用程序并且卡住了.我有一个方法,读取3000多行的文件,每行有一个记录,必须与数据库上的东西进行比较,然后必须将一个寄存器添加到数据库(多对多表).
表和关系是
分公司有很多产品,产品分布在很多分公司.
产品有很多产品,而且一个类别有很多产品
还有更多的桌子在那里工作正常.
我创建的新表/对象是Branch,Product,BranchToProduct.
产品有一组BranchToProduct对象,它们有3个字段
我需要将BranchToProduct对象添加到Product集合中,从我从文件的每一行获得的信息填充3个字段.
我添加一个简单的行,应用程序抛出:
product = productDAO.findByModel(stringModel);
未能懒惰地初始化角色集合:com.bamboo.catW3.domain.Product.products,没有会话或会话被关闭
如果我去hibernate映射(hbm文件)并设置关系product_to_products lazy = false,该行单独运行,但如果我尝试将它放在文件循环中,应用程序将始终挂起正在处理的第18行,不会无论我使用哪个文件或内容的顺序,控制台都停止工作,必须关闭java查杀进程.
无论哪种方式,在调试中,我得到了很多HQL用于简单的查找,13行HQL,直到我在lazy = true时得到我的错误,并且当我使用lazy = false并将其放在循环上时有很多行.
我想我应该尝试用lazy = true解决问题.
这种情况让我想知道:
1.-当懒惰=真.为什么我不能运行此命令的这一行的单行,但它在该类的其他方法上工作正常?
顺便说一下,这是一个名为CatalogFacade的类,它实现了其他clasess的方法:(CategoryFacade,ContainerFacade,ProductFacade,ProductOptionFacade,ProductStatusFacade,UserFacade,EmailFacade,FileFacade,BranchOfficeFacade)
这是
productDao.find()的代码:
public Product find(Integer id) throws DataAccessException {
Product product= (Product) super.find(Product.class, id);
if(product!=null){
product.setProductAttributes(new TreeSet<ProductAttribute>(product.getProductAttributes()));
for (Product ptp : product.getProducts()){
ptp.setProductAttributes(new TreeSet<ProductAttribute>(ptp.getProductAttributes()));
}
}
Run Code Online (Sandbox Code Playgroud)
在这一行中抛出了异常,最后是:
pptp.setProductAttributes(new TreeSet<ProductAttribute>(ptp.getProductAttributes()))
Run Code Online (Sandbox Code Playgroud)
在Intelij的调试器中,我可以看到查询错误地形成的对象:
product.getProducts()= {org.hibernate.collection.PersistentSet@4312}无法评估表达式方法抛出'org.hibernate.LazyInitializationException'异常.
其他属性怎么样都没问题.该产品甚至没有数据库中的其他产品.
UPDATE …
我在一些客户端的Linode服务器上有一个Hibernate,Spring,Debian,Tomcat,MySql堆栈.它是一个Spring-Multitenant应用程序,可为大约30个客户端托管网页.
应用程序启动正常,过了一会儿,我得到这个错误:
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
然而,在抛出此错误之前,nagios警告我ping服务器停止响应.
以前,我有nginx作为代理,并且每个请求都得到这个nginx错误,并且不得不重新启动tomcat:
2014/04/21 12:31:28 [error] 2259#0: *2441630 no live upstreams while connecting to upstream, client: 66.249.64.115, server: abril, request: "GET /catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox= HTTP/1.1", upstream: "http://appcluster/catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox=", host: "www.anabocafe.com"
2014/04/21 12:31:40 [error] 2259#0: *2441641 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 200.74.195.61, server: abril, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "www.oli-med.com"
Run Code Online (Sandbox Code Playgroud)
这是我的server.xml连接器配置:
<Connector …
Run Code Online (Sandbox Code Playgroud) 我有一个用java-spring-hibernate制作的网站,我们从头开始创建自己,它显示了产品目录,我有它的逻辑.我还可以使用我们在flex中制作的管理员来管理内容和产品/类别.我们可能不应该遇到麻烦,因为那里有很多cms,但是它做了什么.该站点使用jstl呈现在html中以flex格式管理的内容.
现在我想添加一个电子商务,因为我们必须将所有付款,发货,订单逻辑添加到管理员和前端(购物车/用户).但是,因为已经有像magento商店这样的东西,我想也许我应该切换并留下我漂亮的应用程序死:/.正如我正在研究的那样,我偶然发现了阔叶商业,这是一种以弹性 - 弹簧 - 冬眠制成的电子商务后端.它相对较新,应该有一个积极的开发团队.所以我想我的问题是,为什么?如果有这么多的开源商务解决方案,他们是否会在开发中做出这样的努力?我的意思是你仍然需要为用户方构建GUI.他们与magento的区别是什么,职业选手是什么?我应该尝试与broadleaf整合吗?什么是组合,然后保持我喜爱的旧应用程序?