在同一方法/事务中执行插入和读取时,休眠集合始终为空



>我正在尝试创建一个休眠实体,然后以相同的方法/事务读取一对多集合,并且对于获取集合调用,它总是返回空。我尝试使用fetch=FetchType.EAGER而不是fetch=FetchType.LAZY,并且我还尝试了在汽车插入之后和汽车读取之前休眠flush(),但一对多集合始终为空。 如果我删除 get Collection 调用(请参阅下面的 getCarList() 并将其放入另一个方法中,则集合不为空,但我希望尽可能保留插入并在同一方法中读取。 我也试过打电话给Hibernate.initialize(this.carList)但仍然空着。 想法?

实体:

@Entity
@Table(name = "car")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "car_type", discriminatorType = DiscriminatorType.STRING)
public class Car {
  private Car defaultCar;
  private List<Car> carList = new ArrayList<Car>();
  @ManyToOne
  @JoinColumn(name = "DEFAULT_CAR_ID")
  public Car getDefaultCar() {
    return defaultCar;
  }
  public void setDefaultCar(Car defaultCar) {
     this.defaultCar = defaultCar;
  }
  @OneToMany(mappedBy = "defaultCar", fetch=FetchType.LAZY)
  public List<Car> getCarList() {
    return carList;
  }
  public void setCarList(List<Car> carList) {
    this.carList = carList;
  }
 @Transient
 public void initializeCarList() {
    Hibernate.initialize(this.carList);
 }

服务实现:

public List<Car> saveAndGetDefaultCarList(){
Car car1 = new Car();
carDAO.create(car1);
Car car2 = new Car();
car2.setDefaultCar(car1);
carDAO.create(car2);
List<Car> defaultCarList = car1.getCarList(); //always returning empty List
}

DAO 实现:

    public class CarDAOImpl implements CarDAO {
        private DaoFactory daoFactory;
        @Override
        public Copy create(Car car) {
            GenericDao<Car> dao = daoFactory.getDao(Car.class);
            return dao.create(car);
        }
        public void setDaoFactory(DaoFactory daoFactory) {
            this.daoFactory = daoFactory;
        }
        public void setCarDao(CarDAO carDAO) {
            this.carDAO = carDAO;
        }
    }
        public class HibernateDaoFactory implements DaoFactory {
            private SessionFactory sessionFactory;
            private HibernateSessionConfigurer sessionConfigurer;
            public <T> GenericDao<T> getDao(Class<T> clazz) {
                HibernateDao<T> dao = new HibernateDao<T>(clazz);
                dao.setSessionFactory(sessionFactory);
                dao.setSessionConfigurer(sessionConfigurer);
                return dao;
            }
            public QueryDao getQueryDao() {
                HibernateQueryDao dao = new HibernateQueryDao();
                dao.setSessionFactory(sessionFactory);
                dao.setSessionConfigurer(sessionConfigurer);
                return dao;
            }
            public void flush() {
                sessionFactory.getCurrentSession().flush();
            }
            public void setSessionFactory(SessionFactory sf) {
                this.sessionFactory = sf;
            }
            public void setSessionConfigurer(HibernateSessionConfigurer cfg) {
                this.sessionConfigurer = cfg;
            }
        }

库版本:

hibernate-core-4.2.0.final
spring-core-3.2.2.RELEASE.jar

春季休眠配置:

<bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
      <tx:method name="create*" propagation="REQUIRED"/>  
    </tx:attributes>
  </tx:advice>

你的 car1 与 car2.setDefaultCar(car1) 之前的对象相同,因为car2.setDefaultCar(car1);只更新 car2 实例。你想要的,是在将 car2 存储在数据库中后更新 car1 状态(从数据库中获取更改)。要在一种方法中执行此操作,您需要 flush() 会话(或提交)并在 car1 实例上调用refresh(car1)方法 - 它将从数据库重新创建。

但是,还有其他方法 - 首先将 car2 添加到 car1 集合,然后只保留 car1 - 这将导致 car2 也将持久化(当设置cascade="save-update"时)。

可能是因为您已经从一对多端反转了关系船,但尚未将关系所有者定义为多对一。

你已经颠倒了关系。所以一对多方不拥有这种关系。所有者将是属性"默认汽车"

@OneToMany(mappedBy = "defaultCar", fetch=FetchType.LAZY)
  public List<Car> getCarList() {
    return carList;
  }

但是您还没有使用ManyToOne注释默认的汽车

尝试正确定义关系的所有者

最新更新