【问题标题】:org.hibernate.MappingException - composite idorg.hibernate.MappingException - 复合 id
【发布时间】:2019-12-06 08:49:15
【问题描述】:

在我的 Spring boot - JPA 应用程序中,我正在尝试实现复合键:

@Entity
public class User 
{
    @Id
    private String timeStamp;
    @Id
    private String firstName;
    @Id
    private String lastName;
}

这给了我错误,说:

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Composite-id class must implement Serializable: com.mua.testkeys.model.User

即使我实现Serializable,它也会给我错误。

我该如何解决这个问题?

使用:Spring + JPA + H2

【问题讨论】:

  • 请添加您遇到的错误Serializable。此外,您似乎错过了一些注释,例如 @IdClass@EmbeddedId,具体取决于您想要做什么。
  • 不确定,但在您的类中使用“@IdClass”或“@EmbadedId”注释,并确认您遵循规则,如无参数构造函数、equles() 和 hashcode() 方法可序列化,与您的自定义实体类一起使用的公共访问修饰符。

标签: java spring spring-boot jpa spring-data-jpa


【解决方案1】:

可以使用@IdClass 创建复合键,如下所示。
User.class

@IdClass(UserPK.class)
@Table(name = "user")
@Entity
public class User {
    @Id
    private String timeStamp;
    @Id
    private String firstName;
    @Id
    private String lastName;
//remaining fields
// getters and setters
}

UserPK.class

public class UserPK {
    private String timeStamp;
    private String firstName;
    private String lastName;
// constructors
// getters and setters
//implement euquels() and hashcode()
}
  1. 为主键定义一个类,将所有键作为字段。
  2. 实现equals()hashcode() 方法。
  3. @IdClass(UserPK.class)注释用户类
  4. 使用 @Id 注释声明 Id 字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多