休眠且无 PK

2022-08-31 17:47:12

是否可以创建一个不包含主键/Id 的表(从 JPA 注释的休眠)?@Entity

我知道这不是一个好主意;表应具有主键。


答案 1

罗杰的自我回答是正确的。详细阐述一下它的含义(起初我不清楚,并认为这会有所帮助):

假设你有一个表 Foo 是这样的:

TABLE Foo (
bar varchar(20),
bat varchar(20)
)

通常,您可以编写一个带有注释的类来处理此表:

// Technically, for this example, the @Table and @Column annotations 
// are not needed, but don't hurt. Use them if your column names 
// are different than the variable names.

@Entity
@Table(name = "FOO")
class Foo {

  private String bar;
  private String bat;


  @Column(name = "bar")
  public String getBar() {
   return bar;    
  }

  public void setBar(String bar) {
   this.bar = bar;    
  }

  @Column(name = "bat")
  public String getBat() {
   return bat;    
  }

  public void setBat(String bat) {
   this.bat = bat;    
  }

}

..但是,的。这个表没有任何我们可以用作id的东西,它是一个遗留数据库,我们用它来[插入重要的业务功能]。我不认为他们会让我开始修改表,以便我使用休眠状态。

相反,您可以将对象拆分为休眠工作结构,该结构允许将整行用作键。(当然,这假设该行是唯一的。

因此,将 Foo 对象一分为二:

@Entity
@Table(name = "FOO")
class Foo {

  @Id
  private FooKey id;

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

  public void getId() {
    return id;
  }
}

@Embeddable
class FooKey implements Serializable {
  private String bar;
  private String bat;

  @Column(name = "bar")
  public String getBar() {
   return bar;    
  }

  public void setBar(String bar) {
   this.bar = bar;    
  }

  @Column(name = "bat")
  public String getBat() {
   return bat;    
  }

  public void setBat(String bat) {
   this.bat = bat;    
  }

}

..应该就是这样。休眠将使用可嵌入密钥作为其所需的标识,您可以像往常一样进行调用:

Query fooQuery = getSession().createQuery("from Foo");

希望这有助于初学者完成这项工作。


答案 2

使用以下代码;休眠没有自己的逻辑来区分重复的记录

如果此方法存在任何问题,请告诉我

@Entity @IdClass(Foo.class)
class Foo implements Serializable {
  @Id private String bar;
  @Id private String bat;

  public String getBar() {
   return bar;    
  }

  public void setBar(String bar) {
   this.bar = bar;
  }


  public String getBat() {
   return bat;    
  }

  public void setBat(String bat) {
   this.bat = bat;    
  }
}

推荐