【问题标题】:Prevent creation of foreign keys in mapping tables?防止在映射表中创建外键?
【发布时间】:2020-10-07 12:34:11
【问题描述】:

我们如何防止在 hibernate 中创建外键? 我需要在我的“oneToMany”关系中插入一些尚不存在的孩子。 Hibernate 应该忽略孩子还不存在的事实。

目前,一旦我尝试插入那些不存在的子项,我就会收到一个外键异常。所以我需要禁用外键创建/使用。

@Entity
@Table(name = "chunk", uniqueConstraints = {@UniqueConstraint(columnNames={"x", "y"})}, indexes = {@Index(columnList = "x,y")})
@Access(value = AccessType.FIELD)
@SelectBeforeUpdate(false)
public class Chunk extends HibernateComponent{

    public int x;
    public int y;
    public Date createdOn;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @Fetch(FetchMode.JOIN)
    @BatchSize(size = 50)
    public Set<Identity> inChunk = new LinkedHashSet<>();

    @Transient
    public Set<ChunkLoader> loadedBy = new LinkedHashSet<>();

    public Chunk() {}
    public Chunk(int x, int y, Date createdOn) {
        this.x = x;
        this.y = y;
        this.createdOn = createdOn;
    }
}

我们如何做到这一点?

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping


    【解决方案1】:

    我找到了一个解决方案......您可以使用“JoinTable”修改创建,而不是让 hibernate 自己完全创建连接表。

    @Entity
    @Table(name = "chunk", uniqueConstraints = {@UniqueConstraint(columnNames={"x", "y"})}, indexes = {@Index(columnList = "x,y")})
    @Access(value = AccessType.FIELD)
    @SelectBeforeUpdate(false)
    public class Chunk extends HibernateComponent{
    
        public int x;
        public int y;
        public Date createdOn;
    
        @OneToMany(fetch = FetchType.EAGER, cascade = {})
        @JoinTable(name = "chunk_identity", joinColumns = @JoinColumn(name = "identity_id"), inverseJoinColumns = @JoinColumn(name = "id"), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
        @Fetch(FetchMode.JOIN)
        @BatchSize(size = 50)
        public Set<Identity> inChunk = new LinkedHashSet<>();
    
        @Transient
        public Set<ChunkLoader> loadedBy = new LinkedHashSet<>();
    
        public Chunk() {}
        public Chunk(int x, int y, Date createdOn) {
            this.x = x;
            this.y = y;
            this.createdOn = createdOn;
        }
    }
    

    这样我们可以定义是否需要外键,或者是否可以简单地忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 2021-08-10
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2013-09-29
      相关资源
      最近更新 更多