如果主键不是唯一的唯一列,如何在休眠状态下保存对象及其相关对象

时间:2019-06-04 08:56:43

标签: hibernate spring-boot spring-mvc

所以,我的问题是我有A类和B类。 这些类之间存在ManyToMany关系。 A类是所有者。

B类具有一个带有自动增量的PK和标签的PK。标签带有唯一约束。因此,PK和标签在数据库中必须唯一。

B类基本上是一个参考表,创建A类对象时通常不应填充它,而只能与该参考表中的对象相关联。但是,从类A创建对象时,我只知道标签,但不知道参考表中的ID。

我已经尝试了很多事情,但是没有达到预期的结果。 基本上,我认为这是A)我设置的CASCADE的问题,以及B是对象实例化的问题,因为我将不得不在不知道ID的情况下向数据库查询标签。但是,在实例化的时候我不知道该怎么做。

我目前作为用例尝试的是创建A的多个实例,并将每个B的多个实例关联在一起。所有B的外观都相同,id = 1L,且标签=“ ABC”。

当我将CASCADE Type设置为“ Merge”时,我没有收到错误,但是我的B表保持为空,而其他表已经被填充。

这是两个类。

有人可能会问为什么我不将标签用作主键。 我的理由是,我假设以后要在比较运算中使用的ID的性能要好于使用String的性能。另外,我认为在其他关系中也可以使用该对象,我认为ID也可以更好地使用。

另一个说明:我了解了euqals方法在这种情况下的作用。可能是这样吗?

@Entity
public class A implements Serializable, Persistent
{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "A_id", unique = true, nullable = false)
public final Long id;

@Column(unique = true)
public final String label;

@ManyToMany(mappedBy = "A_s")
private Set<B> B_s = new HashSet<>();

@PersistenceConstructor
@JsonCreator
public A(@JsonProperty(value = "id", required = true) Long id,         @JsonProperty(value = "label", required = true) String label) {

        this.id = id;
        this.label = label;

public A(String label) {

    this(null, label);

}
}


@Entity
public class B implements Iterable<A>, Persistent
{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public final Long id;

@ManyToMany(fetch = FetchType.LAZY)
@Cascade({CascadeType.MERGE})
@JoinTable(
        name = "A_B",
        joinColumns = { @JoinColumn(name = "B_id") },
        inverseJoinColumns = { @JoinColumn(name = "A_id") }
)
Set<A> A_s = new HashSet<>();

@PersistenceConstructor
private B(Long id, Set<A> A_s)
{
    this.id = id;
    this.A_s = A_s;
}

@JsonCreator
public B(@JsonProperty(value = "A_s", required = true) Set<A> A_s)
{
    this(null, A_s);
}

我想看的是:

我将多个B实例化为互斥体。 我将另存为,并且B也被保存,但前提是它们不在数据库中。 定义在数据库中是因为标签已经在数据库中。不是主键。如果标签已经在数据库中,则应该获取该信息。

我得到的错误类型主要是: org.hibernate.PersistentObjectException:分离的实体传递给持久化

和违反标签唯一性的约束。

0 个答案:

没有答案