无法使用JPA实例化集合持久性

时间:2017-08-15 04:52:22

标签: java spring hibernate jpa

现在我开发了一个多租户系统,使用带JPA和hibernate的spring-boot。

当我想要保存一个集合时有一些问题。 在代码中,有一个JSR 223 Sampler班级'帐户'在embeddable班级,有一个Tenant

租户

Set<Account>

帐户

@Entity
@Table(name = "tenant", 
   uniqueConstraints = @UniqueConstraint(columnNames = "tenant_id"))
public class Tenant extends ConcurrentSafeEntity<Tenant, TenantId> {
    private static final long serialVersionUID = 6910165036330125453L;

    @EmbeddedId
    private TenantId tenantId;

    @Column(length = 20, nullable = false)
    private String name;

    @ElementCollection
    @CollectionTable(name = "tenant_account")
    private Set<Account> accounts;
    ...
}

账户号码

@Embeddable
public class Account implements ValueObject<Account> {
    private static final long serialVersionUID = -2780296854441642870L;

    @Embedded
    private AccountNumber accountNumber;

    @Embedded
    private EncryptedPassword password;
    ...
}

但是当我通过

进行测试时
@Embeddable
public class AccountNumber implements ValueObject<AccountNumber> {
    private static final long serialVersionUID = -2737145407283086518L;

    @Column(name = "account_number", nullable = false, updatable = false)
    private String source;

    @Column(name = "type", nullable = false, updatable = false)
    private String type;
    ...
}

错误是

@Test
public void constructor() throws Exception {
    Tenant tenant = new Tenant(
            tenantRepository.nextIdentity(), "AName",
            new AccountNumber("test@wcscent.com", "email"),
            new EncryptedPassword("aPassword", encryptionService),
            validator
    );

    tenantRepository.save(tenant);
}

对于JPA和hibernate,我还是比较陌生。那么,你能告诉我,我有什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我通过跟踪hibernate代码来解决问题。而这只是因为我的代码不是标准的POJO。

这意味着类的属性可能没有getter或setter。所以hibernate找不到它们。

但我认为这可能是一个错误。因为这种情况恰好发生在AccountNumberEncryptedPassword。它们属于Account

换句话说,如果属性属于TenantAccount,则hibernate可以找到它们,即使它们没有getter和setter。但是如果属性属于AccountNumberEncryptedPassword,那么当hibernate没有getter和setter时,它们就找不到它们。