2016-02-16 3 views
1

je une entité appelée UserWithRoles:clé primaire Composit qui contient une clé étrangère

@Entity 
@Getter 
@Setter 
public class UserWithRoles implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    private String name; 

    private String password; 

    @OneToMany(mappedBy = "user") 
    private List<UserRole> roles; 
} 

Une entité UserRole:

@Entity 
@Getter 
@Setter 
@IdClass(UserRolePK.class) 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "roleType", discriminatorType = DiscriminatorType.STRING, length = 10) 
abstract public class UserRole implements Serializable 
{ 
    @Id 
    // It should be mapped as a foreign PK by user.id (user field declared below) 
    private int userID; 

    @Id 
    private String roleType; 

    @ManyToOne 
    @JoinColumn(name="user_id", referencedColumnName = "id") 
    private UserWithRoles user; 
} 

La UserRolePK de classe de clé primaire:

@Data 
public class UserRolePK implements Serializable 
{ 
    private int userID; 
    private String roleType; 
} 

I voulez créer un composant PK à UserRole: UserWithRoles.id + UserRole.roleType Comment puis-je ma p-il à la base de données? Dois-je utiliser le type UserWithRoles dans la classe PK au lieu de l'ID? Est-ce une bonne idée? Ou je devrais juste utiliser PK normal à UserRole? La relation serait quelque chose comme cela entre les entités ClientOrder et ClientOrdetItem: (ClientOrder.id + ClientOrderItem.num)

Répondre

2

Vous utilisez l'identité dérivée.

Vous devez changer UserRole pour ressembler à ceci:

@Entity 
@Getter 
@Setter 
@IdClass(UserRolePK.class) 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "roleType", discriminatorType = DiscriminatorType.STRING, length = 10) 
abstract public class UserRole implements Serializable 
{  
    @Id 
    private String roleType; 

    @Id 
    @ManyToOne 
    @JoinColumn(name="user_id", referencedColumnName = "id") 
    private UserWithRoles user; 
} 

qui est, se débarrasser du champ userID et ajouter une annotation @Id au champ user.

Et changer UserRolePK pour ressembler à ceci:

@Data 
public class UserRolePK implements Serializable 
{ 
    private int user; 
    private String roleType; 
} 

C'est, changer le nom du champ userID-user, pour correspondre au nom du champ @Id dans UserRole (mais son type doit toujours correspondre à la type du champ PK UserWithRoles, id).

L'identité dérivée est abordée dans la spécification JPA 2.1, section 2.4.1.