【问题标题】:hibernate @joincolumns with insertable true not allowing inserthibernate @joincolumns with insertable true 不允许插入
【发布时间】:2022-08-15 19:43:21
【问题描述】:

我有几个有关系的表,如下图所示

我创建了休眠数据模型如下

@Entity
@Table(name = \"SUBJECT\")
public class Subject {

  @Column(name = \"NAME\")
  private String name;

  @Column(name = \"ADDRESS\")
  private String address;

  @Column(name = \"CLIENT_ID\")
  private String clientId;

  @OneToMany(mappedBy = \"subject\", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private List<SSI> SSIs;

  // getters and setters
  ...
  
}
@Entity
@Table(name = \"SUBJECT_IDENTIFIER\")
public class SubjectIdentifier {

  @Column(name = \"VALUE\")
  private String value;


  @Column(name = \"AUTHORITY\")
  private String authority;


  @Column(name = \"TYPE\")
  private String type;


  @ManyToOne
  @JoinColumns({
      @JoinColumn(name = \"SUBJECT_ID\", referencedColumnName = \"ID\", insertable = true,
          updatable = true,
      @JoinColumn(name = \"CLIENT_ID\", referencedColumnName = \"CLIENT_ID\", insertable =
          true, updatable = true)
  })
  private Subject subject;

  // getters and setters
  ...
}
@Entity
@Table(name = \"SSI\")
public class SSI {
  @ManyToOne
  @JoinColumns({
      @JoinColumn(name = \"SUBJECT_ID\", referencedColumnName = \"ID\", insertable = true,
          updatable = true),
      @JoinColumn(name = \"CLIENT_ID\", referencedColumnName = \"CLIENT_ID\", insertable =
          true, updatable = true)
  })
  private Subject subject;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumns({
      @JoinColumn(name = \"SUBJECT_IDENTIFIER_ID\", referencedColumnName = \"ID\", insertable = true,
          updatable = true),
      @JoinColumn(name = \"CLIENT_ID\", referencedColumnName = \"CLIENT_ID\", insertable =
          true, updatable = true)
  })
  private SubjectIdentifier subjectIdentifier;

  // getters and setters
  ...
}

我打算按如下方式创建实体

  ...
  Subject s = new Subject();
  //.. initialization of s goes here

  SubjectIdentifier si = new SubjectIdentifier();
  //.. initialization of si goes here

  SSI ssi = new SSI();
  ssi.setSubject(s);
  ssi.setSubjectIdentifier(si);

  s.setSSI(ssi);

  ...
  emProvider.get().persist(s); 

当我运行它时,我收到以下错误

org.hibernate.MappingException:实体映射中的重复列:*.SSI 列:CLIENT_ID(应使用 insert=\"false\" update=\"false\" 映射)

如果我为 CLIENT_ID 设置了insert=\"false\" update=\"false\",那么将插入和更新与@Joincolumns 中的其他列混合会再次出错

如果我为所有@JoinColumns 设置insert=\"false\" update=\"false\",那么它将不会保留对象。

如何真正处理这种实体创建?

    标签: java hibernate joincolumn


    【解决方案1】:

    这不是那么容易。如果需要,您必须引入另一个属性来存储客户端 ID 并保持这种非规范化:

    @Entity
    @Table(name = "SSI")
    public class SSI {
    
      @Column(name = "CLIENT_ID")
      private String clientId;
    
      @ManyToOne
      @JoinColumns({
          @JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID", insertable = true,
              updatable = true),
          @JoinColumn(name = "CLIENT_ID", referencedColumnName = "CLIENT_ID", insertable =
              false, updatable = false)
      })
      private Subject subject;
    
      @OneToOne(cascade = CascadeType.ALL)
      @JoinColumns({
          @JoinColumn(name = "SUBJECT_IDENTIFIER_ID", referencedColumnName = "ID", insertable = true,
              updatable = true),
          @JoinColumn(name = "CLIENT_ID", referencedColumnName = "CLIENT_ID", insertable =
              false, updatable = false)
      })
      private SubjectIdentifier subjectIdentifier;
    
      // getters and setters
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2020-02-07
      • 1970-01-01
      • 2013-01-19
      • 2020-01-17
      相关资源
      最近更新 更多