gpt4 book ai didi

java - 在同一方法/事务中执行插入和读取时,Hibernate Collection 始终为空

转载 作者:行者123 更新时间:2023-12-01 13:40:39 25 4
gpt4 key购买 nike

我正在尝试创建一个 Hibernate 实体,然后在同一方法/事务中读取一对多集合,并且对于 get Collection 调用始终返回空。我尝试使用 fetch=FetchType.EAGER 而不是 fetch=FetchType.LAZY 并且我还尝试了 Hibernate flush() > 汽车插入之后,汽车读取之前,但一对多的Collection始终为空。如果我删除 get Collection 调用(请参阅下面的 getCarList() )并将其放入另一个方法中,则 Collection 不为空,但如果可能的话,我希望将插入和读取保留在同一方法中。我也尝试过调用 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

Spring Hibernate 配置:

<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 状态(从数据库获取更改)。要使用一种方法执行此操作,您需要刷新() session (或提交)并在 car1 实例上调用 refresh(car1) 方法 - 它将从数据库重新创建。

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

关于java - 在同一方法/事务中执行插入和读取时,Hibernate Collection 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20821553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com