Spring,Hibernate-多对多-更新错误

Spring,Hibernate-多对多-更新错误,hibernate,spring,mapping,Hibernate,Spring,Mapping,我试图在Hibernate框架中使用多对多关系,但我遇到了一些麻烦 我有两个模型 用户: 我遵循了这方面的线索,因此我的配置文件如下所示: 用户: <hibernate-mapping> <class name="com.bontade.phone_book.mvc.spring.models.User" table="USERS"> <id name="id" type="java.lang.Long"> <column nam

我试图在Hibernate框架中使用多对多关系,但我遇到了一些麻烦

我有两个模型

用户:

我遵循了这方面的线索,因此我的配置文件如下所示:

用户:

<hibernate-mapping>
<class name="com.bontade.phone_book.mvc.spring.models.User" table="USERS">
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="identity" />
    </id>        
    <property name="name" not-null="true" length="100" type="java.lang.String">
        <column name="NAME" />
    </property>       
    <list name="cars" table="USER_CAR" cascade="all">
        <key>
            <column name="USER_ID" />
        </key>
        <list-index></list-index>
        <many-to-many column="CAR_ID" class="com.bontade.phone_book.mvc.spring.models.Car" />
    </list>        
</class>
</hibernate-mapping>

更新

public class CarAOImplementation implements CarDAO {

private HibernateTemplate hibernateTemplate;
private TransactionTemplate transactionTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
    this.transactionTemplate = transactionTemplate;
}

@Override
public void saveCar(final Car car) {
    // TODO Auto-generated method stub
    this.transactionTemplate.execute(new TransactionCallback() {

        public Object doInTransaction(TransactionStatus transactionStatus) {
            try {
                hibernateTemplate.saveOrUpdate(car);
            } catch (Exception e) {
                transactionStatus.setRollbackOnly();
            }
            return null;
        }
    });
}
...
}

更新2

Car markCar = new Car();
markCar.setId(null);
markCar.setMark("111");
carDAO.saveCar(markCar);

User mark = new User();
mark.setId(null);
mark.setName("mark");
List a = new ArrayList<Car>();
a.add(markCar);
mark.setCars(a);
userDAO.saveUser(mark);
List<User> users = userDAO.getAll();
System.out.println("==" + users.size() + "===");
System.out.println(users.get(0).getCars().get(0).getMark());

不要用手固定卡利

Car markCar = new Car();
markCar.setId(1L);  //<-- remove this line
markCar.setMark("111");
carDAO.saveCar(markCar);
carmarkcar=新车();

markCar.setId(1L)// 不要用手固定卡利

Car markCar = new Car();
markCar.setId(1L);  //<-- remove this line
markCar.setMark("111");
carDAO.saveCar(markCar);
carmarkcar=新车();

markCar.setId(1L)//
carDAO.saveCar()
的作用是什么?我已经将它粘贴到了第二个示例中的更新请标记第59行:
位于com.bontade.phone\u book.mvc.spring.controllers。HomePageController.HandlerRequestInternal(HomePageController.java:59)
@Ralp,是的,它只在code
System.out.println(users.get(0.getCars().get(0.getMark())上生成
carDAO.saveCar()的作用是什么?我已经将其粘贴到更新请在第二个示例中的第59行:
位于com.bontade.phone\u book.mvc.spring.controllers。HomePageController.HandlerRequestInternal(HomePageController.java:59)
@Ralp,是的,它只在code
System.out.println(users.get(0.getCars().get(0.getMark())上生成是的,我知道,但当我将markCar(id为空)添加到列表中时,我得到了错误:
org.hibernate.LazyInitializationException
所以我通过hand@bontade:因此您需要修复LazyInitializationException:请添加CarDAO.saveCar(Car)的代码方法和org.hibernate的堆栈跟踪。LazyInitializationException@bontade:
如果汽车已经存在,我不知道casacade=ALL是否会导致问题?@bontade:你接受了我的答案:这是否意味着你解决了问题?@Ralp,你的答案修复了
org.hibernate.StaleStateException
,但是现在我得到了
org.hibernate.LazyInitializationException
是的,我知道,但是当我在列表中添加markCar(id为空)时,我得到了错误:
org.hibernate.LazyInitializationException
所以我通过hand@bontade:因此您需要修复LazyInitializationException:请添加CarDAO.saveCar(Car)的代码方法和org.hibernate的堆栈跟踪。LazyInitializationException@bontade:
如果汽车已经存在,我不知道casacade=ALL是否会导致问题?@bontade:你接受了我的答案:这是否意味着你解决了问题?@Ralp,你的答案修复了
org.hibernate.StaleStateException
,但是现在我得到了
org.hibernate.LazyInitializationException
public class CarAOImplementation implements CarDAO {

private HibernateTemplate hibernateTemplate;
private TransactionTemplate transactionTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
    this.transactionTemplate = transactionTemplate;
}

@Override
public void saveCar(final Car car) {
    // TODO Auto-generated method stub
    this.transactionTemplate.execute(new TransactionCallback() {

        public Object doInTransaction(TransactionStatus transactionStatus) {
            try {
                hibernateTemplate.saveOrUpdate(car);
            } catch (Exception e) {
                transactionStatus.setRollbackOnly();
            }
            return null;
        }
    });
}
...
}
Car markCar = new Car();
markCar.setId(null);
markCar.setMark("111");
carDAO.saveCar(markCar);

User mark = new User();
mark.setId(null);
mark.setName("mark");
List a = new ArrayList<Car>();
a.add(markCar);
mark.setCars(a);
userDAO.saveUser(mark);
List<User> users = userDAO.getAll();
System.out.println("==" + users.size() + "===");
System.out.println(users.get(0).getCars().get(0).getMark());
    Hibernate: select user0_.ID as ID0_, user0_.NAME as NAME0_ from USERS user0_
==1==
2011-02-23 17:35:10 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/PhoneBook] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.bontade.phone_book.mvc.spring.models.User.cars, no session or session was closed] with root cause
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.bontade.phone_book.mvc.spring.models.User.cars, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
    at org.hibernate.collection.AbstractPersistentCollection.readElementByIndex(AbstractPersistentCollection.java:173)
    at org.hibernate.collection.PersistentList.get(PersistentList.java:293)
    at com.bontade.phone_book.mvc.spring.controllers.HomePageController.handleRequestInternal(HomePageController.java:59)
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Car markCar = new Car();
markCar.setId(1L);  //<-- remove this line
markCar.setMark("111");
carDAO.saveCar(markCar);