【问题标题】:Hibernate OneToMany with ORA-02291 error休眠 OneToMany 并出现 ORA-02291 错误
【发布时间】:2015-08-20 08:39:22
【问题描述】:

在 OneToMany 关系中将实体与其子实体持久化时遇到问题。 这是我的两个实体:

@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);

有解决这个问题的办法吗?

谢谢大家!

【问题讨论】:

  • 不知道这个问题?

标签: hibernate one-to-many ora-02291


【解决方案1】:

我认为您需要将@JoinColumn 的名称属性删除到地址表中

@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"。

【讨论】:

  • 嗨托尼,很遗憾你的解决方案不能解决我的问题:(
【解决方案2】:

从昨天开始我就陷入了困境,但现在我找到了解决问题的方法。在我的情况下,错误是由于我有 TRIGGERS 将 MY_SEQUENCE.nextval 设置为其各自实体的表的 PK。

然后,更改 TRIGGER 以验证来自实体的 :new.PK 是否为空的解决方案来设置它。相反,如果它不为空,则可以理解为 SEQUENCE 是从 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多