休眠且无 PK
是否可以创建一个不包含主键/Id 的表(从 JPA 注释的休眠)?@Entity
我知道这不是一个好主意;表应具有主键。
是否可以创建一个不包含主键/Id 的表(从 JPA 注释的休眠)?@Entity
我知道这不是一个好主意;表应具有主键。
罗杰的自我回答是正确的。详细阐述一下它的含义(起初我不清楚,并认为这会有所帮助):
假设你有一个表 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");
希望这有助于初学者完成这项工作。
使用以下代码;休眠没有自己的逻辑来区分重复的记录
如果此方法存在任何问题,请告诉我
@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;
}
}