gpt4 book ai didi

java - #Hibernate 是否有必要在保存包含它的对象之前保存属于复合键的每个对象?

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:48 24 4
gpt4 key购买 nike

我有 3 个实体。以免将其称为 A、B、C 和第 4 个具有组合键的 ID 组合。

@Entity
public class A {
@Id
@GeneratedValue(generator = "generator")
private String id;
}

@Entity
public class B {
@Id
@GeneratedValue(generator = "generator")
private String id;
}


@Entity
public class C {
@Id
@GeneratedValue(generator = "generator")
private String id;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "c", fetch = FetchType.LAZY)
private List<ClassWithCompositeKey> relations = new ArrayList<ClassWithCompositeKey>();

}

@Entity
public class ClassWithCompositeKey {

@EmbeddedId
protected CompositeKey compositeKey;

@JoinColumn(name = "A_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private A a;

@JoinColumn(name = "B_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private B b;

@JoinColumn(name = "C_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private C c;

public ClassWithCompositeKey(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
this.compositeKey = new CompositeKey(a.getId(),b.getId(),c.getId());
}

}

@Embeddable
public class CompositeKey {

@Basic(optional = false)
@Column(name = "A_ID", columnDefinition = "raw")
private String aId;
@Basic(optional = false)
@Column(name = "B_ID", columnDefinition = "raw")
private String bId;
@Basic(optional = false)
@Column(name = "C_ID", columnDefinition = "raw")
private String cId;

public CompositeKey(String aId, String bId, String cId) {
this.aId = aId;
this.bId = bId;
this.cId = cId;
}
}

然后当我尝试保存时:

A a = new A();
B b = new B();
C c = new C();
entityManager.persist(a);
entityManager.persist(b);
//I'm not saving C
ClassWithCompositeKey classWithCompositeKey = new ClassWithCompositeKey(a, b, c);
c.getRelations().add(classWithCompositeKey);
entityManager.persist(c);

我遇到异常“ConstraintViolationException:列‘C_ID’不能为空”

这是因为在保存“c”之前c.id 为null,但是这个值转到了CompositeKey 实例。

我想保存“c”并自动保存了 ClassWithCompositeKey 的集合。但是现在我首先必须在将 ClassWithCompositeKey 实例附加到它并保存之后保存“c”。有可能(可能通过使用其他类型的映射)在一个“持久”调用中通过级联保存 C 和 ClassWithCompositeKey 吗?

最佳答案

只有在 persist 时你才会在 C 处得到生成的值,这就是你得到异常的原因。

因为 hibernate 只会在插入操作后更新生成的值。它将首先插入然后更新连接列。

在上面的场景中,你有 c 类的 C_ID,它是主键映射到 ClassWithCompositeKey 的 C_ID,它也是主键,并且明显的主键不能为 null。

因此请尝试使用外键列重新设计您的 ClassWithCompositeKey。

关于java - #Hibernate 是否有必要在保存包含它的对象之前保存属于复合键的每个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com