Hibernate and no PK
Roger's self-answer is correct. To elaborate a bit on what is meant (I wasn't clear on it at first and figured this would help):
Say you have you have a table Foo as such:
TABLE Foo (bar varchar(20),bat varchar(20))
Normally, you can write a class w/Annotations to work with this table:
// 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; }}
.. But, darn. This table has nothing we can use as an id, and it's a legacy database that we use for [insert vital business function]. I don't think they'll let me start modifying tables in order for me to use hibernate.
You can, instead, split the object up into a hibernate-workable structure which allows the entire row to be used as the key. (Naturally, this assumes that the row is unique.)
Split the Foo object into two thusly:
@Entity@Table(name = "FOO")class Foo { @Id private FooKey id; public void setId(FooKey id) { this.id = id; } public void getId() { return id; }}
and
@Embeddableclass 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; }
}
.. And that should be it. Hibernate will use the Embeddable key for its required identity and you can make a call as normal:
Query fooQuery = getSession().createQuery("from Foo");
Hope this helps first-timers with getting this working.
Use following code; Hibernate doesn't have its own logic to distinguish duplicate records
Let me know if there are any issues with this approach
@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; }}