Join multiple tables for one entity with JPA? - java

I was wondering if it was possible to create an entity that fetches data from multiple tables.
I have an entity based on a TableA.
The particularity is that I also need data from TableD, which is linked to TableC, which is linked to TableB finally linked to TableA with TableA id
I am fully aware that I could create an entity on TableB,C,D.
But I don't need ANY data on those tables except on TableD. B and C are just "a path to follow".
http://img11.hostingpics.net/pics/878537schema.png
I saw the #SecondaryTables annotation that I could use on EntityA but it seems like you can only join with the PK of EntityA.
If you know a solution that will prevent me from creating useless entities, I'd be grateful.

You can link each entity through inheritance strategy InheritanceType.JOINED. Then you can get all values of parent classes in child class.

Related

Querying/Selecting rows from Parent Entity when using Hibernate JOINED inheritence strategy

I know there are three types of inheritence strategies: SINGLE_TABLE, TABLE_PER_CLASS, JOINED. I think the best choice is JOINED if I want my underlying database to be normalized. However, let us consider this usecase: I have a Parent Entity and one Child Entity that extends this Parent Entity. The inheritence strategy I am using is JOINED. Now, from the front-end of the application I can add Parent and Child entities. When I do search from front-end to get all Child Entities I am able to get all the Child Entities. Now, when I try to do a search only on Parent Entity I see that the result set contains all the entities(Parent + Child) and I understand why this is happening. My question is that is there any way we can search/query for only Parent entities(excluding rows from Child entity) when I am using the JOINED inheritence startegy?
Newer versions of Hibernate optimize this, but you have to make sure you are not selecting the entity or use fields of the parent table.

Hibernate Annotation Confusion

Recently, I have been learning about Hibernate, and I am facing some difficulties. My first problem is as follows: I am very much confused with the below terms.
Bidirectional mapping
Many to One
Because, as far as I know, in rdbms we first need to insert in parent table. Then we can insert on child table, so the only possible scenario is one-to-many (first parent then children). Then, how is many-to-one is going to work? Second, what is this bidirectional mapping in regards to Hibernate. Specifically, different types of join annotations confuse me a lot. I am listing those annotations below.
1.#JoinTable(name = "Tbale_Name", joinColumns = { #JoinColumn(name = "Column_Name") },
inverseJoinColumns = { #JoinColumn(name = "Another_ColumnName") })
2.#OneToMany(mappedBy="department")` this mappedby term
3.#PrimaryKeyJoinColumn
Please help me understand these concepts.
The first thing I would say is don't think in terms of tables but think in terms of Objects.
What you are trying to express with the annotations is the relationship between objects, let hibernate work out how to persist the data. You can obviously manually check the SQL but the idea of using an ORM is to map the relationships between entities accordingly and let the ORM figure out the complexity around generating SQL etc.
Its worth noting that the parent -> child relation can be mapped using #ManyToOne by adding mappedBy to the non-owning (child) side of the relationship. Hibernate then will determine which entities to insert into the database first. Running with a TransactionManager will enforce integrity with multi table inserts. Hibernate will also workout which entities need to be persisted, for example if you add an new object on the many side to an existing object on the one side.
Furthermore, its worth understanding that in some cases it won't always be the database that generates the primary key in a parent -> child foreign key. Its possible for the code to generate the Identifier and hibernate will persist them according.
Bidirectional mapping means that object entities have a reference to each other. i.e. You can retrieve the second entity from the first entity. Bidirectional mapping supports one-to-many
or many-to-many. I.e. OneToMany = a Set on one of the entities. Many-To-Many = Sets on both entities.
JoinTable tells hibernate that a table in the database can be used to map to other tables together. See JPA "#JoinTable" annotation for more information. JoinColumn tells hibernate what column to use to make the join between the two entities. Hibernate needs these to construct the SQL.

How to make OneToMany annotation in hibernate

I have a database that, there is relations between some of tables of it,
for example, I have to table Person and Company, and there is a one to many relation between their Id that is build in a table name Person_Company generated by hibernate.
when I use #OnetoMany and #ManytoOne annotations in java,
It make relation between them, but not according to Person_Company table
and I use just Id 's of table
what is correct annotation?
You want the association to be mapped using a join table. So the annotation is (drumroll...) #JoinTable. The javadoc has examples, and the Hibernate documentation as well.

Hibernate Join Table with Child

I have two tables (folder and document) which have a many to many relationship with a join table in between, this join table then also has another one to many relationship with a third table (document_title).
I want to be able to fetch a document_title from a document, what is the correct way to model this in hibernate?
The object model needs to be a Document that contains a DocumentTitle instance.
Thanks
I'm afraid what you're trying to do does not fit nicely into into OO world. I'd introduce thrid entity class as in-between. This third class can contain any attributes you like. So insted of many-to-many you would have two one-to-many relationships (or one-to-many and many-to-one).

Many-to-many relationship on the same entity without additional join table columns

I have an entity that has many-to-many association to itself.
If I needed some additional properties (like asked here) the answer would be to use a new intermediate entity. But without them is it bad practice to use direct many-to-many association to the entity itself?
Aleksey,
If you have additional columns, you need a new intermediate Entity.
But without them is it bad practice to use direct many-to-many association to the entity itself ?
No, you can if you want since you do not have additional columns on The joined Table
Using a mapping table is the optimal way for N to N relations without creating new columns in the mapped tables themselve.

Categories