如何将现有的 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 和类似的同步它们。
我正在尝试将 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 和类似的同步它们。