如何将现有JPA实体映射到PicketLink

时间:2015-07-09 00:36:11

标签: jpa picketlink

我正在尝试将Seam 2应用程序迁移到CDI并使用PicketLink来提高安全性。在完成所有阅读和研究之后,似乎所有示例都在PicketLink模型和后端实体之间进行了一对一映射。例如Account to AccountEntity,分区到PartitionEntity。由于我已经有代表身份模型的实体,我一直试图将它们映射到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 个答案:

答案 0 :(得分:1)

得到Pedro(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可以使用@AttributeValue将属性与@AttributeProperty映射到实体属性。但它只能映射到一个实体。因此,无法将用户及其属性映射到帐户和人员。但是你可以在模型中拥有实体(在我的例子中是accountEntity)。我还必须在新的IdentityTypeEntity和我现有的Account实体(username,eanbled,createdDate)中复制几个字段,因为PL需要这些字段。使用@PrePersist和类似的方法同步它们。