Reputation: 20316
I have to apply JPA in a legacy database with an awful design. Unfortunately is not possible to change it. Luckily is only for read-only access.
One of the strangest things I found is a "many-to-many" relationship without a join (or intermediate) table. This is a simplification of the table structure:
USER ACCESS
---- ------
ID int primary key ID int primary key
NAME varchar2(20) NAME varchar2(20)
ACCESS_GROUP int ACCESS_GROUP int
"Conceptually" this tables must be mapped with Java classes this way:
public class User {
private Integer id;
private String name;
@ManyToMany private List<Access> accessList;
}
public class Access {
private Integer id;
private String name;
@ManyToMany private List<User> userList;
}
But I think this is not possible. What do you think is the best approach to access this tables in JPA and navigate through them?
Upvotes: 11
Views: 9796
Reputation: 1
I thiknk the many to many definition suits better in this case than the one to many approach. Although you can choose either but with different behaviour and performance. Reading the javax documentation got through Eclipse, the propper mapping for the without jointable case like that should be:
public class User {
@Column(name = "ACCESS_GROUP")
private Integer group;
@ManyToMany(targetEntity=Access.class)
private List<Access> accessList;
...
}
public class Access {
@Column(name = "ACCESS_GROUP")
private Integer group;
@ManyToMany(targetEntity=User.class, mappedBy="accessList")
private List<User> userList;
...
}
Upvotes: 0
Reputation: 242686
You can try to map it as two read-only one-to-many relationships:
public class User {
@Column(name = "ACCESS_GROUP")
private Integer group;
@OneToMany
@JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP",
insertable = false, updateable = false)
private List<Access> accessList;
...
}
public class Access {
@Column(name = "ACCESS_GROUP")
private Integer group;
@OneToMany
@JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP",
insertable = false, updateable = false)
private List<User> userList;
...
}
Upvotes: 12