2015-07-09 3 views
1

Я пытаюсь перенести приложение Seam 2 в CDI и использовать PicketLink для обеспечения безопасности. После всех чтений и исследований кажется, что все примеры имеют одно из сопоставлений между моделью PicketLink и объектной базой. например Account to AccountEntity, PartitionEntity. Поскольку у меня уже есть сущности, представляющие модель идентичности, я застрял в попытке сопоставить их с PicketLink. Вот что у меня есть:Как сопоставить существующие объекты JPA с PicketLink

@MappedSuperClass 
public class ModelEntityBase implement Serializable { 
    @Id @Generated 
    Long id; 
    Date creationDate; 
} 

@Entity 
public Account extends ModelEntityBase { 
    String username; 
    String passwordHash; 
    @OneToOne(mappedBy = "account") 
    Person person; 
} 

@Entity 
public Person extends ModelEntityBase { 
    String name; 
    String email; 
    @OneToOne 
    @JoinColumn(name = "account_id") 
    Account account; 
} 

Два лица (плюс супер класс), представляющих единую модель идентичности в PicketLink, например, стерео тип пользователя.

Исходя из этого why IdentityType id is String not Long, я попытался добавить новый объект в:

@Entity 
@IdentityManaged(BaseIdentityType.class); 
public class IdentityTypeEntity implement Serializble { 
    @Id @Identifier 
    private String id; 

    @OneToOne(optional = false, mappedBy = "identityType") 
    @OwnerReference 
    private Account account; 

    @IdentityClass 
    private String typeName; 

    @ManyToOne @OwnerReference 
    private PartitionEntity partition; 
} 

Я попробовал несколько различных способов с аннотаций и классов моделей. Но при использовании IdentityManager.add (myUserModel) я просто не могу заставить его заполнять все сущности. Возможно ли это?

ответ

1

Получил помощь от Педро (PicketLink Dev). Отправьте ответ здесь, чтобы помочь другим. Это класс модели, в которой я закончил использовать.

@IdentityStereotype(USER) 
public class User extends AbstractAttributedType implements Account { 
    @AttributeProperty 
    private Account accountEntity; 
    @AttributeProperty 
    @StereotypeProperty(IDENTITY_USER_NAME) 
    @Unique 
    private String username; 
    @AttributeProperty 
    private boolean enabled; 
    @AttributeProperty 
    private Date createdDate; 
    @AttributeProperty 
    private Date expiryDate; 
    @AttributeProperty 
    private Partition partition; 
    // getter and setter omitted 
} 

И создал новый объект для отображения этой модели:

public class IdentityTypeEntity implements Serializable { 
    @Id 
    @Identifier 
    private String id; 

    @OneToOne(optional = false, mappedBy = "identityType", 
     cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @AttributeValue 
    // @NotNull 
    private HAccount accountEntity; 

    @IdentityClass 
    private String typeName; 

    @ManyToOne 
    @OwnerReference 
    private PartitionEntity partition; 

    @AttributeValue 
    private String username; 

    @AttributeValue 
    // @Transient 
    private boolean enabled; 

    @AttributeValue 
    private Date createdDate; 

    @AttributeValue 
    private Date expiryDate; 
} 

PL можно сопоставить свойство с @AttributeProperty в сущности собственности с @AttributeValue. Но он может отображаться только для одного объекта. Поэтому невозможно сопоставить, скажем, Пользователь и его свойства для учетной записи и лица. Но вы можете иметь сущность (в моем случае accountEntity) в модели. Я также должен дублировать несколько полей в новом IdentityTypeEntity и моем существующем объекте Account (имя пользователя, eanbled, createdDate), потому что PL требует их. Используйте @PrePersist и похожи на их синхронизацию.

Смежные вопросы