Java 1:n是否为n侧禁用约束? 问题

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的整个作业); 级联在这里是不可能的,我只

我有一个1:n的关系,但是n边不应该依赖于约束。所以我实际上想通过未来的id插入一个EntityPojo,当它还没有保存时(让我们忽略这是一个糟糕的做法)。这看起来有点像这样


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