Java 1:n是否为n侧禁用约束? 问题
我有一个1:n的关系,但是n边不应该依赖于约束。所以我实际上想通过未来的id插入一个EntityPojo,当它还没有保存时(让我们忽略这是一个糟糕的做法)。这看起来有点像这样Java 1:n是否为n侧禁用约束? 问题,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我有一个1:n的关系,但是n边不应该依赖于约束。所以我实际上想通过未来的id插入一个EntityPojo,当它还没有保存时(让我们忽略这是一个糟糕的做法)。这看起来有点像这样 var relation=newrelationshippojo(); . . . add(session.getReference(futureID,EntityPojo.class)); session.save(关系); //几帧后 session.save(包含指定ID的整个作业); 级联在这里是不可能的,我只
var relation=newrelationshippojo();
.
.
.
add(session.getReference(futureID,EntityPojo.class));
session.save(关系);
//几帧后
session.save(包含指定ID的整个作业);
级联在这里是不可能的,我只有它的未来ID,而不是我想要保存的对象的引用。将来只有它的id
@实体
@表(name=“关系”)
@访问权限(AccessType.FIELD)
公共类关系shippojo{
.
.
.
@ManyToMany(cascade={},fetch=FetchType.EAGER)
public Set targets=new LinkedHashSet();
}
问题:
我们如何告诉hibernate它应该忽略这个1:n“目标”关系的约束?它应该只将给定的ID插入数据库,忽略EntityPojo是否真的存在
很高兴在这个话题上有任何帮助,谢谢 有关更简单的解决方案,请参见下面的编辑 如果目标是在连接表中插入行,而不影响
实体\u POJO
表,则可以将多对多关联建模为实体本身:
@Entity
@Table(name = "relationship")
@Access(AccessType.FIELD)
public class RelationshipPojo {
@OneToMany(cascade = PERSIST, fetch = EAGER, mappedBy = "relationship")
public Set<RelationShipEntityPojo> targets = new LinkedHashSet<>();
}
@Entity
public class RelationShipEntityPojo {
@Column(name = "entity_id")
private Long entityId;
@ManyToOne
private RelationshipPojo relationship;
@ManyToOne
@NotFound(action = IGNORE)
@JoinColumn(insertable = false, updatable = false)
private EntityPojo entity;
}
唯一需要注意的是,当您尝试在插入缺少的
EntityPojo
之前加载RelationshipPojo.targets
时,Hibernate会抱怨缺少的实体,因为显然@NotFound
在SQL级别被@ManyToMany忽略,这很容易做到。N
侧的引用列定义为可空。因此,可以将其指定为确定值(在这种情况下,相同的值必须存在于1
)或NULL(当然,在这种情况下,此行不表示任何内容)。搜索文档如何在Hibernate中实现这一点。如果您的问题是我们是否可以在拥有方(n
-side)插入引用方(1
-side)尚未出现的id
),那么答案是肯定的,这是可能的。但是我们必须删除/不定义拥有方的外键约束。此外,我很确定JPA不支持这一点。你能更详细地解释一下你到底想实现什么吗?在联接表中插入行,而不在实体\u POJO
表中插入任何内容?@crizzis。将行插入到没有约束的.targets中。没有外键异常,因为实体还不存在。请看我的答案,然后谢谢,我将尝试一下!你知道如果没有一个额外的pojo它是否有可能吗^^请参阅我编辑的答案。我现在觉得自己很笨,抱歉弄糊涂了谢谢,这很有效!
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
@JoinTable(inverseJoinColumns = @JoinColumn(name = "target_id", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)))
public Set<EntityPojo> targets = new LinkedHashSet<>();