当前位置: 首页 > 知识库问答 >
问题:

JPA实体管理器未正确更新具有一对一关系的字段

濮书
2023-03-14

我正在使用Hibernate4.1.0.Final和hibernate-jpa-2.0-api。我在使用实体管理器更新具有OneTo在许多关系的实体时遇到了问题。这是实体:

@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex")
@Entity
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})})
public class Organization implements Serializable
{

    …
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(name = "cb_organization_address",
              joinColumns = @JoinColumn(name = "organization_id"),
              inverseJoinColumns = @JoinColumn(name = "address_id"))
    private List<Address> addresses;

当我尝试使用新的一对多列表更新实体(使用实体管理器的合并方法)时,地址未保存。我像这样创建列表...

    List<Address> addresses = new ArrayList<Address>();
    addresses.add(address);
    ...
    org.setAddresses(addresses);
    m_orgDao.save(org);

这是相关的DAO代码...

@Autowired
private EntityManager entityManager;

@Override
public Organization save(Organization organization)
{
    if(StringUtils.isEmpty(organization.getId()))
    {
        entityManager.persist(organization);
    }
    else 
    {
        organization = entityManager.merge(organization);
    }

    return organization;
}

返回的组织具有一个地址,其中所有字段均为 null。我可以对实体经理和实体执行哪些不同的操作,以确保数据正确持久化?

共有1个答案

雍骏俊
2023-03-14
 @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})  

而不是

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
 类似资料:
  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 我有一个EAR应用程序(要部署在WebLogic12c上),它有一个“持久化”组件。“persist”组件使用JPA(实现:EclipseLink)来持久化对象。 使用entityManager的bean声明为,实体管理器通过注释注入。 问题是,我每次尝试访问entityManager时都有一个(意思是他没有被正确注入)。 persistence.xml 我在常规代码中是这样使用的: MyBean

  • 我的两个实体有一对一的关系 我尝试通过此方法删除我的用户实体 PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id) 但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.Pa

  • 我有一个JPA实体(人)与其他实体(地址)有多对一的关系。在一个对象可以被系统使用之前,这个对象必须得到主管的批准。我将原始实体存储为byte[]并对“工作”实体进行更改,并将其存储在数据库中。如果这些更改不被批准,我必须恢复原始状态。因此,我将存储的原始数据从byte[]中转换出来,并使用实体管理器将其合并到数据库中。所有的工作都很好,但是如果一个新的地址实体已经添加到“工作”的人,在合并还原的

  • 问题内容: 是否可以在JPA的一对一关系的两边使用@JoinColumn?我的印象是,应该始终在一对一关系的拥有方中使用它,因为拥有方将具有外键列,并且此注释定义了外键列的属性。请说明我的理解是否正确。 编辑#1- 我想知道,在哪种情况下我们将在一对一关系的两边都使用@JoinColumn批注? 问题答案: OneToOne关系不一定是双向的。当在源对象和目标对象中都存在对该关系的另一个对象的引用

  • 问题内容: 有一个实体类“ A”。A类可能具有相同类型“ A”的子级。如果“ A”是孩子,则也应保留它的父母。 这可能吗?如果是这样,我应该如何在Entity类中映射关系?[“ A”有一个id列。] 问题答案: 是的,这是可能的。这是标准双向@ManyToOne/ @OneToMany关系的特例。之所以特别是因为关系两端的实体都是相同的。JPA 2.0规范的第2.10.2节详细介绍了一般情况。 这