Правильный ответ Роджера. Чтобы немного пояснить, что имеется в виду (сначала я не понял этого, подумал, что это поможет):
Скажем, у вас есть таблица 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;
}
}
.. Но, черт возьми. В этой таблице нет ничего, что мы могли бы использовать в качестве идентификатора, и это устаревшая база данных, которую мы используем для [вставить жизненно важную бизнес-функцию]. Я не думаю, что они позволят мне начать изменять таблицы, чтобы я мог использовать спящий режим.
Вместо этого вы можете разбить объект на работоспособную структуру, которая позволяет использовать всю строку в качестве ключа. (Естественно, это предполагает, что строка уникальна.)
Разделите объект 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;
}
}
.. И так и должно быть. Hibernate будет использовать ключ Embeddable для своей требуемой личности, и вы можете сделать вызов как обычно:
Query fooQuery = getSession().createQuery("from Foo");
Надеюсь, это поможет начинающим с этим работать.