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

How to map existing JPA entities to PicketLink

我正在尝试将 Seam 2 应用程序迁移到 CDI 并使用 PicketLink 来确保安全。经过所有阅读和研究,似乎所有示例都在 PicketLink 模型和后端实体之间具有 一对一 映射。例如Account 到 AccountEntity,Partition 到 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 中单个身份模型的两个实体(加上一个超级 class),例如立体声用户。

基于此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;
}

我尝试了几种不同的注释和模型方法 classes。但是当使用 IdentityManager.add(myUserModel) 时,我无法让它填充所有实体。这甚至可能吗?

从 Pedro (PicketLink Dev) 那里得到了帮助。 Post这里的回答是为了帮助别人。 这是我最终使用的模型 class。

@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 和我现有的帐户实体(用户名、eanbled、createdDate)中复制一些字段,因为 PL 需要这些。使用@PrePersist 和类似的同步它们。