【问题标题】:Hibernate OneToMany relation with non primary key one side and EmbeddedId on other sideHibernate OneToMany 与一侧的非主键和另一侧的 EmbeddedId 关系
【发布时间】:2018-08-01 06:27:42
【问题描述】:

我正在尝试建立一种奇怪的 OneToMany 关系(出于遗留原因)。关系应该在i 上,这是P 类的普通列和B 类的主键的一部分。

以下方法仅在我创建 P 对象、将它们放入 B 对象(所有 b 为 b.setP(p))并将所有 B 设置为 P 对象(p.getBs().addAll(bList))时才有效。

但是,如果我保存一个没有任何 B 的 P 对象,当我执行 P p1 = session.get(P.class, p.getSI()) 时,我会得到以下对我没有任何意义的异常。您对如何完全解决此问题有任何想法吗?

原因:java.lang.IllegalArgumentException:无法设置 java.lang.String 字段 com.s.s.components.P.i 到 java.lang.String

@Entity
public class P {

  @Id
  @Expose
  @ValidUniqueId
  @NotEmpty
  @Column(nullable = false)
  String sI;

  @Expose
  String i;

  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "p")
  private Set<B> bs = new HashSet<>();  
}

@Embeddable
public class IPT implements Serializable {
  @Column(name = "i")
  private String i;

  @Column(name = "pT")
  private PT pT;
}

@Entity
public class B {
  @EmbeddedId
  private IPT iPT;

  @ManyToOne
  @MapsId("i")
  @JoinColumn(name = "i", referencedColumnName = "i", insertable = false, updatable = false)
  private P p;
}

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping


    【解决方案1】:

    我认为您需要将referencedColumnName 更改为referencedColumnName = "sI",因为这是P 的id

    【讨论】:

    • 但是sIi 不包含相同的信息。 p.i 应与 b.i 相同
    • 外键应该指一个键,要么是主键,要么是唯一索引……不知道i是否唯一
    • 那么数据库中的数据呢……没有错误插入的重复项?
    • 或者你试图插入一张已有 i 的图片
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多