【问题标题】:Hibernate Cascade.All property doesn't add ON DELETE CASCADE on Postgres Foreign Key ConstraintHibernate Cascade.All 属性不会在 Postgres 外键约束上添加 ON DELETE CASCADE
【发布时间】:2019-01-22 03:25:09
【问题描述】:

我正在使用 SpringBoot + PostgreSQL + JPA Hibernate,一切似乎都运行良好,但是 Cascade.ALL 属性未应用于表 user_roles。我错过了什么重要的东西。我尝试过多对多关系和多对一,但还没有运气。

我使用的实体文件如下。

User.java

@Entity
@Table(name = "USERS")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {


  @Id
  @SequenceGenerator( name = "lineupSeq", sequenceName = "lineup_seq", allocationSize = 20, initialValue = 50 )
  @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "lineupSeq" )
  @Column(name="id")
  private Long id;

  @Column(unique=true)
  private String username;

  @Column
  @JsonIgnore
  private String password;

  @Column(name="prodcrud")
 private String prodcrud;

  @Column(name="devcrud")
  private String devcrud;

  @Column(name="testcrud")
  private String testcrud;



@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "user_roles", 
    joinColumns = {@JoinColumn(name = "user_id", referencedColumnName="id") },
    inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName="id") })
private Role role;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

添加了 postgres 约束的屏幕截图 Postgres constraint added

【问题讨论】:

    标签: java postgresql hibernate spring-boot jpa


    【解决方案1】:

    是的,你只是希望这个注解能做一些它没有做的事情。

    Cascade.ALL 告诉 JPA 在运行时使用 JPA 在User 上完成的每个操作(持久化、合并、删除等)也必须应用于其role

    请注意,这没有意义:因为它是ManyToOne,所以在删除用户时尝试删除用户的角色会导致外键约束损坏,因为其他用户也引用了相同的角色。

    阅读文档。不要猜测注释的作用。

    【讨论】:

    • 感谢您的回复。我可以通过简单地替换如下代码来解决问题@ManyToOne(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2013-01-30
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多