1

Seam 2 アプリを CDI に移行し、セキュリティのために PicketLink を使用しようとしています。すべての読み取りと調査の後、すべての例で、PicketLink モデルとバックエンド エンティティが1 対 1 でマッピングされているようです。たとえば、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 の単一の ID モデル (ステレオ タイプのユーザーなど) を表す 2 つのエンティティ (およびスーパー クラス)。

これに基づいて、 IdentityType id が String ではなく 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) を使用すると、すべてのエンティティを設定することができません。これは可能ですか?

4

1 に答える 1

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 は @AttributeProperty を持つプロパティを @AttributeValue を持つエンティティ プロパティにマップできます。ただし、マッピングできるエンティティは 1 つだけです。したがって、User とそのプロパティを Account と Person にマッピングする方法はありません。ただし、エンティティ (私の場合は accountEntity) をモデルに含めることができます。また、新しい IdentityTypeEntity と既存の Account エンティティ (username、eanbled、createdDate) でいくつかのフィールドを複製する必要があります。これは、PL がこれらを必要とするためです。@PrePersist などを使用してそれらを同期します。

于 2015-07-13T02:26:52.043 に答える