我正在尝试将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)时,我无法让它填充所有实体。这甚至可能吗?
答案 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和类似的方法同步它们。