【问题标题】:EntityManager doesn't update data in @ManyToMany relation fieldEntityManager 不更新 @ManyToMany 关系字段中的数据
【发布时间】:2016-09-17 09:30:48
【问题描述】:

我正在使用 ORM Hibernate 的 JPA 并有下一个 DAO 类:

public class CarsOrm  {
    @PersistenceContext(unitName = "springHibernate", type = PersistenceContextType.EXTENDED)
    EntityManager em;

    @Transactional
    public boolean addCar(Car car) {
        if (em.find(Car.class, car.regNumber) != null)
            return false;
        Model model = em.find(Model.class, car.modelName);
        if (model == null)
            return false;
        em.persist(car);
        return true;

    }

    @Transactional
    public boolean addOwner(Owner owner) {
        if (em.find(Owner.class, owner.id) != null)
            return false;
        em.persist(owner);
        return true;

    }


    public Iterable<Owner> getOwners(long regNumber) {
        Car car = em.find(Car.class, regNumber);
        return car==null?null:car.getOwners();
    }

   ...
}

实体是下一个:

@Entity
@Table(name = "cars")
public class Car {
    @Id
    long regNumber;
    String color;
    @ManyToOne
    Model model;
    @ManyToMany(fetch = FetchType.EAGER)
    Set<Owner> owners;
...
}

@Entity
@Table(name = "owners")
public class Owner {
    @Id
    int id;
    String ownerName;
    int yearBirth;
    @ManyToMany(mappedBy = "owners", fetch = FetchType.EAGER)
    Set<Car> cars;
...
}

我正在做接下来的步骤:

  1. 创建所有者对象:Owner owner = new Owner(1000000, "Petro", 1976); (owner.cars == null) 并使用 CarsOrm.addOwner() 保存它
  2. 创建汽车对象:

    整数[] 所有者 = {所有者};
    Car car = new Car(9999999, "Black", Owners, model.getModelName());

(car.owners 填充)并使用 CarsOrm.addCar() 保存它

当我使用 CarsOrm.getOwners(long regNumber) 之后,它返回 null。 Orm 不向数据库发出请求 - 它从步骤 1 中保存的 owner.cars == null 的现金中获取对象。如果我在保留对象时重新启动程序,则该功能可以正常工作-检索正确的所有者集。 为什么对象 owner 不会在另一个对象之后更新 - car 坚持并更改它的汽车集?

【问题讨论】:

    标签: java hibernate jpa many-to-many


    【解决方案1】:

    您可以尝试将cascade = {CascadeType.PERSIST, CascadeType.MERGE} 添加到您的@ManyToMany 注释中。

    但我建议不要依赖休眠。您应该在 Car 的构造函数中将汽车添加到所有者。如果您在持久化实体之前进行一些额外的检查,这将很有帮助,例如在 JUnit 测试中。

    public Car(long regNumber, String color, Owner owner, Model model){
      ...
      owner.addCar(this);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多