7

I have a Person entity mapped by Hibernate to a database table in a database catalog "Active". After a period of time, records in this database table in the "Active" catalog are archived/moved to an exact copy of the table in a database Catalog "History". I have the need to retrieve from both the Active and History Catalogs. Is there a better way to model this with Hibernate annotations than making an abstract class that 2 classes extend from.

This is what I have now.

@MappedSuperclass
public abstract class Person  {

    @Id
    private Integer id;
    private String name;
}

@Entity
@Table(name="Person", catalog="Active")
public class PersonActive extends Person {
}

@Entity
@Table(name="Person", catalog="History")
public class PersonHistory extends Person {
}
Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124

3 Answers3

1

To my knowledge, that would be the right way to do it with annotations (you kinda have two tables so you need two entities). Then run a polymorphic query on the Person entity. I find this pretty clean by the way.

PS: Can you add a pointer on how to do this with mapping files, I'm really curious.

Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • 1
    Thanks for the insight. In the past when I've had this business requirement with other projects that I was using Spring JDBC, I would just have one class and one row mapper for both of the tables. I haven't done it before with hibernate, but here's an example http://old.nabble.com/Mapping-class-to-multiple-tables-with-entity-name-(hibernate-plugin)-to9547563.html (...) (...) – Daniel Spivey Mar 04 '10 at 18:13
0

I think there is a subproject of hibernate named shards. It is designed to work with multiple relational databases. If you want to use it, you may need big changes in your code.

Jérôme Verstrynge
  • 57,710
  • 92
  • 283
  • 453
AmirMV
  • 215
  • 1
  • 11
0

My thought would be to write a query to select both tables from db A and B. then create a query with hibernate and map it to your class.

example:

@Entity
@NamedNativeQuery(
name="GetAllPerson",
query="select * from A.Person inner join B.Person on A.Person.Id = B.Person.Id"
)
public class Person  {
...
}

Not sure if it could work, your question made me also curious about the best way to do it :). I'll test it tonight after work and see if its any good.

Elio
  • 463
  • 6
  • 18