Hibernate and no PK Hibernate and no PK database database

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;      }}


i found that this trick works:

<id column="ROWID" type="string" />