|
我想在以下(简化的)数据库中应用JPA:- T d5 A' E' y5 l8 r8 V
NODE AUTHORITY
; O+ ?, l+ V5 p( g5 x" p----- ----------
2 c* D% B( y4 H8 r1 @idNode int idAuthorities int
: r& b/ i* n/ N5 ?nameNode varchar(50) person varchar(255): P) B. w5 q* I5 M5 @) N
idAuthorities int rank int
/ B- ]; z/ @$ p4 ?* W: ]; s3 UPRIMARY KEY (idNode) PRIMARY KEY (idAuthorities, rank)
/ G6 ]8 W8 `" }9 @6 E7 OFOREIGN KEY (idAuthorites)
8 e; X/ W! e+ _因此,一个节点可以具有多个权限,并且一个权限可以被多个节点引用。
" C( B+ ]& c6 Y8 p7 B3 u我希望我的班级看起来像这样:5 i! z* D( L+ F1 d. [; D
@Entity# e+ ]3 L7 ]* v4 w) D( i; K
@Table(name="NODE")
0 h; N) G' L4 ]/ w) ^" r4 Apublic class Node {! j2 q# S" \6 Q5 ^+ r! y. u& H
private Integer id; p% U' ?9 G/ F6 W, _
private String nameNode;+ M& w ]& y8 R: U5 Q
private Set authorities;
, |7 ]$ k9 m4 t$ q$ M1 ~ // ... getter and setter normaly annoted for "id" and "nameNode", t+ [! ]+ X6 F7 D8 Q
@ManyToMany& i/ O: z- U2 k5 \
public Set getAuthorities(){
7 J8 u" H# B/ |) I; D3 X& O2 W4 I return authorities;1 h; s" \. h4 \1 t! F# G
}
' _ u$ Z ~; M3 Y5 \ // ... setter .... a2 ]/ `/ L' z+ m% i( y
}( C' E( l q( @$ B _
@Entity
) M3 [% N- d+ b. y# y3 U@Table(name="AUTHORITY"), h8 M4 G" k+ G0 b
public class Authority {' H7 Z9 b( o: F# I$ X
private AuthorityPK pk;
( N4 e! w/ q U/ Z& N private String person;
; D' j+ C& f, v) |5 l privat Set nodes;- U; S0 X' K# W* ~4 P5 w
// ... getter and setter normaly annoted for "person"' Q. i+ z6 e t$ j& d: s* G
@Id
$ O7 o, w5 c5 E4 L% ?$ i! @ public AuthorityPK getPk(){
2 _0 X* v, ^* t8 F) ?& V) m& l9 z return this.pk. d# w* I( h. F. @6 b1 P# j a1 {
}+ L' F* [ S+ i5 ?+ |. @$ P
// ... setter ...8 u2 {6 k+ H L& U) _0 S
@ManyToMany( J: S& R2 X# \/ v8 I
public Set getNodes(){
% B( P5 P: k5 ~9 e, |2 D+ ? return nodes;
8 l4 ~! U# P. S6 ^ }5 x' n3 l! y/ g! Y
// ... setter ...7 v# U+ Z# q7 l" e+ z, D$ i* K# |0 D
}
( h6 y2 i$ x" Z9 r9 M@Embeddable8 w3 d. y! O3 q& ^3 t6 Q/ w
public class AuthorityPK implements Serializable {
& z9 O( E+ x* ~4 t+ d. [ private Integer idAuthorities;
- b( k( M I3 H4 e# l private Integer rankAuthorities;. Z* a" G' E0 J* A# n* r
// override of equals and hashCode# d! s2 { P1 x0 |6 p2 m D) `
}9 r# [2 }- n' L8 J
但是注释“ @ManyToMany”似乎仅可用于“ @JoinTable”,在这种情况下,它不可用(据我所知)。有人知道修改数据库之外是否还有其他方法吗?
; F2 m8 w) ~8 F' ^ ' B4 E% |3 `0 o: Q" T3 ?0 g Y- ]
解决方案:( ?3 A* k" X, ?5 V2 Y
" J' d) u$ t7 E) ^2 J. D/ W
, L9 a. @; a5 n) [/ M% r' f7 U: a# y
JPA不允许这样做,因为它需要外键来引用完整的主键以用于标识目的,并且它可能不适用于缓存。如果可以,我建议使用使用实际主键的关系表切换到更传统的模型。) W. F. Y+ {3 Q1 L) f) Y
如果您的提供程序允许映射部分pk(我相信Hibernate可以这样做),您要做的就是使用JoinColumn而不是JoinTable进行两个1:M映射,但是将Node->
6 n; h8 @+ y$ u9 j5 \2 lAuthority上的一个标记为insertable = false,updatable = false。
' ]% |9 t4 L- @ B+ }例如,类似:% F6 B' R; P) U, f+ |( I# m
public class Node {
$ A- h+ p# g0 F a" s; _% _ @Id/ T' _1 _8 t0 W3 ?7 s
private Integer id;0 C) Q \4 s5 `7 g0 E
private String nameNode;
5 ~4 \' K* W5 G' m! q" E @OneToMany( s3 K& y3 ?9 m+ H) _7 l- R3 l: @+ [
@JoinColumn(name = "idAuthorites", referencedColumnName = "idAuthorites", insertable=false, updatable=false), S; u2 y3 C4 x! r! u
private Set authorities;4 T5 \& G/ o2 _ F* Z2 Q/ n
...
7 r& t+ x8 X9 |+ B0 E6 wpublic class Authority {: r9 x, n# x4 k8 n) [
@Id: K0 _) \$ B9 }( r2 i/ r1 p6 H
private AuthorityPK pk;. n! C) D5 x6 q% t/ W
private String person;
* \+ Y6 J2 v; ^$ M8 U3 z# T6 u @OneToMany+ B4 T1 Q' D, {1 a f O
@JoinColumn(name = "idAuthorites", referencedColumnName = "idAuthorites")
! i; D" J7 D" g. {; S private Set nodes;7 o: R% }1 h! \' u4 ?% {7 o8 Y" L
... |
|