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

使用ORA-02291错误HibernateOneToMany

纪畅
2023-03-14

我有一个问题,当坚持一个实体和它的孩子在一对多的关系。这里我的两个实体:

@Entity
@Table(name="USER")
public class User implements Serializable {
  ...
  @Id
  @Column(name="ID_USER")
  private String idUser;

  @OneToMany(mappedBy="user", cascade=CascadeType.PERSIST)
  private List<Address> address;

  public List<Address> getAddress() {
     return this.address;
  }

  public void setAddress(List<Address> address) {
     this.address = address;
  }

  public Address addAddress(Address address) {
     getAddress().add(address);
     address.setUser(this);

     return address;
  }

  public Address removeAddress(Address address) {
     getAddress().remove(address);
     address.setUser(null);

     return address;
  }
  ...
}

@Entity
@Table(name="ADDRESS")
public class Address implements Serializable {
    ...


   @EmbeddedId
   private AddressPK id;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="ID_USER", insertable=false, updatable=false, nullable=false)
    private User user;

    public User getUser() {
        return this.user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

@Embeddable
public class AddressPK implements Serializable {
   ...
   @Column(name="ID_USER", insertable=false, updatable=false)
   private String idUser;
   ...
}

现在是生成ORA-02291错误的持久化操作:

User u = new User();
u.setAddress(new ArrayList<Address>());

u.set...

Address a1 = new Address();
a1.set...
u.addAddress(a1);

Address a2 = new Address();
a2.set...
u.addAddress(a2);

entityManager.persist(u);

有办法解决这个问题吗?

谢谢大家!

共有2个答案

拓拔意
2023-03-14

从昨天起我就陷入了这个困境,但现在我找到了解决问题的办法。在我的例子中,错误是因为我有触发器来设置我的_序列。下一步为其各自实体表的主键。

然后,解决方案将更改触发器以验证:new。实体的PK为空以设置它。相反,如果它不是空的,则可以理解该序列是由JPA设置为PK的。例如:

create or replace TRIGGER "MYSCHEMA"."TGR_MYTABLE_INSERT"
  before insert on MYTABLE
  for each row
  begin
  if :new.PK_MYTABLE is null then
    select SEQ_MYTABLE.nextval
    into :new.PK_MYTABLE
    from dual;
  end if;
  end;
暴阳州
2023-03-14

我认为您需要删除地址表中@JoinColumn to的name属性

@Entity
@Table(name="ADDRESS")
public class Address implements Serializable {
...
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(insertable=false, updatable=false)
private User user;

public User getUser() {
    return this.user;
}

public void setUser(User user) {
    this.user = user;
}

}

您已经从用户端获得了mappedBy=“user”。

 类似资料:
  • 我尝试按如下方式创建父表和子表: 我创建了两个程序来插入记录: 我已经创建了SSIS包来调用这两个过程。父记录插入成功。但是对于子表过程,我得到以下错误: “[Execute SQL Task]错误:执行查询”BEGIN GetSourceLogId(?,?输出);终止失败,出现以下错误:“违反了ORA-02291:完整性约束(PATIENTMDR.FK_SOURCELOG_PROCESSLOG)

  • 我做了一些研究,有一个建议可以使用双重 但是现在我得到了ORA-06502/ORA-06512错误: ORA-06502:PL/SQL:erreur numérique ou erreur sur une valeur ORA-06512:àsys.xmltype“,ligne 272 ORA-06512:àligne 1 06502。00000-“PL/SQL:数值或值错误%s” *原因:出现算

  • 我是Oracle SQL新手,我下载了Oracle SQL developer,它附带了一些您可能知道的预编程表。所以我选择了(Employees)表来练习我的Insert语句。我运行下面的脚本,我得到一个错误,纸条是 列的顺序如下: 错误是: 从命令中的第1行开始出错- 插入员工值(1000、'Anouar'、'Seljouki'、'Seljouki84@gmail.com,0662777081

  • 问题内容: 我创建了一个触发器,如下所示: 我正在尝试在Trigger_1中插入一行 它给了我错误: 谁能帮忙吗? 问题答案: 只需删除 从触发代码。在正在进行的事务中触发执行,因此您无法进行单独的提交。提交事务后,您在trigger_2中的插入也将提交。

  • 因此,我正在用Oracle编写一些代码,并建立了以下表格: 下载表连接用户和产品表,其中包含外键user_id和product_id。我正试图通过以下代码将数据插入下载表: Oracle然后给我以下错误: 错误报告-ORA-02291:完整性约束(BC29369.DOWNLOADS_FK2)违反-未找到父密钥。 我很清楚为什么我不应该把它作为我的首要关系。有人知道如何解决这个问题吗?提前谢谢你!

  • 我正在创建一个表,我输入了这个命令: 我得到了这个错误: 有人能告诉我错误在哪里以及如何纠正吗?