当前位置: 首页 > 知识库问答 >
问题:

如何使泛型类对多个实体使用JPARepository

齐朝明
2023-03-14

场景:一个应用程序有多个实体。每个实体表示一个数据库表。所有html" target="_blank">数据库表都有一个主键列,但列名不同。

实体示例:

@Entity
@Table(name = "ABC",schema = "XYZ" )
public class SaveData extends EntityClass {

    @Id
    @Column(name = "ABC_ID", nullable = false, insertable = true, updatable = true, precision = 0)
    private int id;

    @Column(name = "ABC1_ID", nullable = false, insertable = true, updatable = true, precision = 0)
    private int abc1_id;

    @Column(name = "DATA", nullable = true, insertable = true, updatable = true, precision = 0)
    private String data;

   //Getter - Setter methods of the above member variables.

}
@MappedSuperclass
public abstract class EntityClass {

    @Id
    private int id;
}
@Repository
public interface DaoRepos extends JpaRepository<EntityClass,Long> {

}

服务类示例:

@Component
public class ServiceMethodsImpl implements ServiceMethods {

    @Autowired
    private DaoRepos daoRepos ;

    @Override
    public void saveDatainDB(SaveData saveData ) {
        daoRepos.save(saveData);
    }

}

问题:如果我像下面这样声明dao接口:

@Repository
public interface ReviewRepos extends JpaRepository<SaveData,Long> {

}

将参数作为savedata发送到JPararePository中,然后我的savedatainDB方法在服务类中运行良好。

但是Spring不允许在没有@id列的情况下创建类EntityClass。所以我必须声明一个ID列。同样,在我的数据库中,每个表都有一个主列,但所有表的该列的名称是不同的。例如,表XYZ将有一个主列xyz_id表ABC将有一个主列abc_id

因此,我必须在子类实体savedata中定义一个ID列,并使用@column注释。

现在,当我尝试保存时,将在SaveData类中存在的ID列之外创建一个单独的ID列。这个额外的ID会创建错误,因为无法识别的列

在如何处理这个问题上的任何帮助都将被感激。也请验证我的方法是否正确。

共有1个答案

邬阳
2023-03-14

对于遗留系统,可以使用@AttributeOverride注释重写id列名。

@Entity
@AttributeOverride(name="id", column=@Column(name="ABC_ID"))
@Table(name = "ABC",schema = "XYZ" )
public class SaveData extends EntityClass {

    @Column(name = "ABC1_ID", nullable = false, insertable = true, updatable = true, precision = 0)
    private int abc1_id;

    @Column(name = "DATA", nullable = true, insertable = true, updatable = true, precision = 0)
    private String data;    
}
 类似资料:
  • 我在我们公司做项目,我有一个注入对象的问题。让我们考虑一下我有这个实体提供商: 并使用上面的实体提供程序扩展JPAContainer 问题是(我理解),我无法使用类类型定义@Inject对象,因为Inject方法需要一个空构造函数。这里有什么解决方案吗?如何让它发挥作用?现在我得到了一个例外 非常感谢您的回答:)Ondrej

  • 问题内容: 我有课 和班级 关键是该方法不安全,因为我可以提供的项目与当前报告无关,但与其他报告相关,编译器不会抱怨。 是否可以用类型安全的方式编写该方法,即我们可以仅将T作为当前报表的类型作为参数传递。 问题答案: 我认为您正在寻找以下内容。 它的工作方式是: 您想用从 您要确保所有列表都属于同一类型 为了将参数绑定到从扩展的对象,您需要对自身进行参数化: 您添加需要从报表扩展的绑定 但是您要

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 问题内容: 我有一个具有通用类型的Interface Foo- 有另一个实现该接口的Bar类,但我想要的是Bar的通用Type应该是Interface A和B类型的集合,使用以下定义,它给出了编译器错误- 您能提出实现此目标的正确方法吗? 我只能在方法级别使用多个范围吗? 问题答案: 这行不行吗?

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 当我保存以下实体时,它在另一个对象中复制相同的值: 例如,在我的struts项目(屏幕)中,如果我更改shipmentShipper字段的值,那么Shipment收货人也将使用相同的值进行更新。 实体: 仓库类: JSP中的字段映射(工作正常): 请检查屏幕截图,我将发货人更改为C4并保存。收货人也被选为C4。请注意,两个选择都使用相同的数据列表填充。(客户名单)