【问题标题】:Hibernate Onetomany self join adds unique constraintHibernate Onetomany 自连接添加了唯一约束
【发布时间】:2020-10-05 15:07:51
【问题描述】:

我想添加一个实体与其自身的一对多关系:

@Entity
public class Layer {

@Id
private Long id;

@Column(name = "PARENT_ID")
private String parentId;

@OneToMany
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", updatable = false, insertable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Set<Layer> siblings;    
}

这意味着我想让所有其他实体共享相同的parentId。我想要它的原因是因为为这个实体编写查询会更容易。

问题是在数据库生成时(spring.jpa.properties.hibernate.hbm2ddl.auto=create)它还在PARENT_ID 列上添加了一个唯一约束,我不希望这样。

如何防止休眠添加唯一约束?

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa hibernate-mapping


    【解决方案1】:

    您的映射当前使children 通过列PARENT_ID 引用其父级。为了使用某些东西作为参考,它必须是唯一的。

    您可能希望孩子通过id 引用他们的父母。

    这应该可以解决问题:

    @OneToMany
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "ID", updatable = false, insertable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
    private Set<Layer> children;    
    

    我不确定您是否也可以拥有String parentId。 首先它映射到与children 属性相同的列,但类型不同:id 的类型为Long,而应该引用它的parentId 的类型为String

    执行此操作的正常方法是创建一个属性Layer parent,其中@ManyToOnemappedBy children

    【讨论】:

    • 我知道理想情况下连接应该发生在主键/外键上。这是一个例外情况,我想根据一个公共属性对所有实体进行分组。该属性不是主键。显然,如果我没有唯一约束,这可以完成。问题是 Hibernate 添加了唯一约束。
    • 您是说Layer 的子代应该是所有Layer 实例和相同的parent_id?哪个当然总是包含Layer 本身?从来没有见过这样的事情。
    • 是的,没错。也许“孩子”不是最好的词。更好的术语是“兄弟姐妹”。是的,这个列表也会包括它自己。
    • 如果它实际上与唯一键(我猜还有外键)分开工作,您总是可以使用自己的脚本来创建模式。至少对于无论如何强烈推荐的生产部署。
    • 你是对的。这就是我最终采用的解决方案 - 自己生成/修改架构。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多