【问题标题】:Using Entity without ID使用没有 ID 的实体
【发布时间】:2019-06-24 22:03:21
【问题描述】:

我在 SQL 数据库中有一个表,其中包含重复条目(这意味着我无法创建复合键)并且没有主键。

我希望能够检索与特定列 accountRef 匹配的所有条目。

简而言之,我想执行以下查询:

SELECT * from table where accountRef='xyz'

其中“xyz”是用户输入。

我面临的问题是使用 @Entity 不允许我不指定 ID。有没有办法解决这个问题? 这是我的代码 BasicAccountAudit.java

@XmlRootElement
@Entity
//@Embeddable
@Table(name = "tb_Account_History", schema="dbo")
public class BasicAccountAudit implements Serializable{


private String accountRef;
private String client;

//getters and setters

BasicAccountAuditRepository.java

@Repository
public interface BasicAccountAuditRepository extends CrudRepository<BasicAccountAudit, Integer> {

    List<BasicAccountAudit> findAll();

    List<BasicAccountAudit> findByAccountRef(String accountRef);
}

我的尝试

我尝试使用@Embeddable,但它给了我这个错误:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“basicAccountController”的bean时出错:通过方法“setBasicAccountDao”参数0表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“basicAccountDaoImpl”的 bean 时出错:通过方法“setBasicAccountAuditRepository”参数 0 表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“BasicAccountAuditRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type:

【问题讨论】:

  • JPA entity without id的可能重复
  • JPA 不是没有 ID 的选项。没有解决方法。如果您不能使用某种唯一标识符,则可能使用 mybatis 回退到 JDBC。

标签: java sql-server spring rest jpa


【解决方案1】:

在 JPA 中必须使用简单主键或复合键,始终建议使用 PK,也不要使用 ORM。 如果您想将实体序列化为没有 id 的 XML(@XmlRootElement 注释建议我),您可以在 id 字段上使用@XmlTransient 注释,或者更好的方法是创建一个传输对象并仅映射您需要的那些属性连载。 Mapstuct 是一个很好的选择,可以让它变得简单。

【讨论】:

  • 那么,如果我将 XmlRootElement 替换为 XmlTransient ,我就不需要 ID 了吗?
  • 你总是需要id,但如果你不想序列化它,用XmlTransient注释id。
  • 但这必须是我的数据库中存在的 ID 字段吧?我的问题是我的表中没有唯一的 id 字段
  • 你为什么不创建一个?
  • 那你必须和管理员谈谈,他们应该学习如何设计数据库表
【解决方案2】:

您需要一个 ID 来创建实体。就这么简单。但是,您可以只创建一个自动增量 ID 并忽略它。您可能不需要它,但 JPA 需要它。如果您已经定义了 ID,则另一个选项是将 UUID 设置为您的 ID,并让它自动生成。在这种情况下,您无需担心值是什么,也没有顺序,而是提供存储库和实体的 ID。

This 是一个实现 UUID 的答案,该 UUID 可以使用 hibernate 4 和 spring。

关于基于用户输入获取信息列表的示例,您可以定义存储库或 EntityManager 并自己编写脚本。接受用户的输入并将其添加到查询中,然后执行它,返回结果。这很简单。您可以查看 here 的 EntityManager 和 here 的 Repository。

但您的问题的简短回答是,创建一个您不需要的随机主键 ID,即使数据可能有重复项。

【讨论】:

  • 我如何创建一个自动增量 ID?我的数据库中没有 id 列,无法更改表
  • @MarkJ 如果无法更改表,可以将实体的所有成员设置为 ID。有关如何执行此操作的示例,请参阅 here
  • 但如果我有重复的条目,将所有值设置为 @id 仍然不起作用,因为条目不是唯一的
  • 我相信 JPA 认识到将所有值设置为 @ID 意味着您的表中没有设置唯一值并将每个值都识别为它自己的对象。您只需要小心按 id 调用 find one,因为您的 id 不是唯一的,并且会引发意外的结果大小异常。
  • 我厌倦了这样做,但我仍然没有得到正确类型的数据,还有其他我可以使用的类吗?
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多