问题描述
JPA文档指出 CollectionTable.joinColumns 属性是收集表的外键列,它们引用实体的主表."
JPA documentation says that CollectionTable.joinColumns property is "The foreign key columns of the collection table which reference the primary table of the entity."
我可以使其不引用实体表的主键列,而是引用具有唯一值的另一列吗?
Can I make it reference not the primary key column of the entity table, but another column which has unique values?
有一个具有以下表的遗留数据库(简化):
There is a legacy database with following tables (simplified):
staff:
user_id (int)
user_name (varchar, primary key)
staff_privileges:
id_user (int)
privileges_id (int)
privileges_status (boolean)
现在,我将Hibernate引入项目,并尝试将此表映射到实体:
Now I'm introducing Hibernate into the project and trying to map this tables to the entity:
@Entity
@Table(name = "staff")
public class User {
@Column(name = "user_id")
private Integer userId;
@Id
@Column(name = "user_name")
private String userName; // primary key column (legacy, cannot be changed)
@ElementCollection
@CollectionTable(name = "staff_privileges", joinColumns = @JoinColumn(name = "id_user"))
@MapKeyColumn(name = "privileges_id")
@Column(name = "privileges_status")
private Map<Integer, Boolean> privileges; // privilegeId <-> isEnabled
}
不起作用,因为@CollectionTable创建对主键staff_privileges.id_user -> staff.user_name (primary key)
的引用.它应该是:staff_privileges.id_user -> staff.id_user
.有没有办法覆盖此参考?是否有任何Hibernate或JPA注释?我想保持简单,如果可能的话,不要引入任何新的Entity或Embeddable.
Won't work because @CollectionTable creates reference to primary key: staff_privileges.id_user -> staff.user_name (primary key)
.It should be: staff_privileges.id_user -> staff.id_user
.Is there way to override this reference? Are there any Hibernate or JPA annotations for this? I would like to keep things simple and not introduce any new Entity or Embeddable if possible.
推荐答案
假设每个用户的user_id
也是唯一的,那么您只需将User
上的@Id
批注移动到userId
:您的JPA提供者不知道数据库中实际的PK是什么,只要该值是唯一的,就不会引起任何问题.
Assuming that user_id
in also unique for each User then you could simply move the @Id
annotation on User
to userId
: your JPA provider has no knowledge of what the actual PK is in the database so as long as that value is unique it would not cause any issues.
上下文略有不同,但请参见:
Slightly different context but see:
https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key
唯一的区别是,如果您从映射中对表进行反向工程,则将使用user_id而非user_name上的PK创建人员表.
The only difference would be if you were reverse engineering your tables from your mappings then the staff table would be created with PK on user_id rather than user_name.
这篇关于覆盖@CollectionTable对主键列的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!