覆盖Spring数据JPA id注释。

时间:2017-06-07 08:20:04

标签: java spring spring-data-jpa

我正在使用Spring-data-Jpa,我有一个实体

@Entity(name="person")
public class Person implements Serializable {

@javax.persistence.Id
private long dbId;

@Id
private final String id;

// others attributes removed
}

在上面的课程中,我有两个不同的ID id (用org.springframework.data.annotation.Id标记)和 dbId (用javax.persistence.Id标记) ),因为我的 id 字段总是填充一个唯一的标识符(对于我从其他地方获取的Person类)所以在使用Spring JpaRepository时它总是尝试更新记录,因为它不在db,没有任何反应。

我调试代码并看到它使用 SimpleKeyValueRepository 获取 id 字段 id ,因此它总是得到一个值和尝试更新记录,我可以覆盖此行为以使用 dbId 而不是 id 字段吗?有没有办法实现相同的配置或注释,任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

每个实体必须只有一个@Id。另一方面,您可能希望将列声明为unique。它可以通过以下方式完成:

@Entity(name="person")
public class Person implements Serializable {

    @Id
    private Long id;

    @Column(unique = true)
    private final String uuid;

    // others attributes removed
}

另外请记住,Spring Data JPA id应该是引用Long而不是基元,因为您希望使用id = null保存对象。

String id可能应为String uuid并初始化为String uuid = UUID.randomUUID().toString();

类似的情况将是用户的唯一电子邮件要求。一方面,它将成为主键,但另一方面,您不会将其标记为@Id

如果您需要进一步澄清或者您的环境更复杂,请在下面的评论部分询问。