【问题标题】:What should be done If I need to create abstract class or interface instance using Java?如果我需要使用Java创建抽象类或接口实例应该怎么做?
【发布时间】:2022-01-10 23:26:21
【问题描述】:

我正在学习 Java 和 Spring 框架,因此,在我的 Java Web 应用程序中,我有接口 Client 和两个实现此接口的类 - PersonClientCompanyClient。此外,还有接口 Account 和实现此接口的类 - DebitAccount

package com.bankapp.bankwebapplication.models;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class DebitAccount implements Account {
    @Id
    private Long id;
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    private Long clientId;
    public Long getClientId() { return clientId; }
    public void setClientId(Long clientId) { this.clientId = clientId; }

    private Long amountOfMoney;
    public Long getAmountOfMoney() { return amountOfMoney; }
    public void setAmountOfMoney(Long amountOfMoney) { this.amountOfMoney = amountOfMoney; }

}

本课程已提交clientId。这是一个问题。如您所见,这不是数据库,所以,我不能只创建private Long clientId。它必须是类而不是 Long 数据类型,但是,我有接口,我不能创建接口实例,但我明白,我不能这样,它必须是类数据类型,不是Long

我在考虑抽象类,但是和接口一样,它是关于多态性的,我也不能创建抽象类实例。如何弄清楚?还是应该只为CompanyClientPersonalClient 创建2 个字段?

【问题讨论】:

  • 我不太明白这个问题。是什么阻止您声明 Client client;
  • 首先,据我所知,你不能创建抽象类的接口实例(在这种情况下),其次,当我尝试这样做时,我得到了这个错误:@ 987654334@

标签: java spring interface polymorphism abstract-class


【解决方案1】:

"...this is not DB..." 与 @Entity 注释相反。您的字段 clientId 似乎是对您的客户实体之一的外部引用。

通常这种 1:n 关系由 JPA 通过实体引用建模,尽管 DB 只有一个 Long ClientId 作为外键。当您获取结果集时,客户端实例的创建由 JPA 实现(例如 Hibernate)完成。

但是您必须通过指示描述关系的 DB-Field 来注释成员。例如。 (假设一位客户可以拥有多个 DebitAccount):

@ManyToOne(mappedBy="clientId")
Client client;

另一方面,@Entity 实现(Client 的后代)必须注释 Hibernate 如何区分这两种类型,例如通过 DB-Field ClientType。有很多可能性对此进行建模。这个link 可能是一个起点。

【讨论】:

  • 这个mappedBe 是行不通的。我不知道为什么,实际上
  • 你说Client是你代码中的一个接口。您应该将其设为具有数据库表字段的实际类。这就是对象关系映射的工作原理
【解决方案2】:

这是我对问题的解决方案。我只是在类名和变量名之前添加了transient,就像这样:

private transient Client clientId;
public Long getClientId() { return clientId.getId(); }
public void setClientId(Client clientId) { this.clientId = clientId; }

例如,使用getClientId我只需要调用接口中的方法。

【讨论】:

  • 这个'transient'是一个java关键字,它表示如果你序列化实例,这个字段不会序列化。还有 JPA-Annotation @Transient 告诉 JPA 实现该字段不映射到 DB 字段,而是由您的代码维护。
  • 在 JPA 的上下文中 transient@Transient 具有相同的功能。对于这两种解决方案,瞬态字段都不是持久的,这意味着在从数据库中读取条目时,您的 clientId 不会被数据库表中的值填充,并且如果您将条目保存到数据库中,则不会设置 clientId。我不确定这是否是你真正想要的......
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 2014-08-18
  • 2023-03-08
  • 2014-04-08
  • 2015-11-21
  • 2011-09-24
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多