JPA - 可以将 id 默认为 0 吗?
JPA - is it ok to default an id to 0?
我有一个带有自动递增 ID 的简单实体。
@Entity
public class MyEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
这有一个为我生成的 hashCode 方法。
@Override
public int hashCode()
{
return (int) (id ^ (id >>> 32));
}
问题是我正在尝试向此 class 添加审核,但它在实体持久化之前调用 hashCode,因此 id 为空。
我的解决方案(有效)是将 id 初始化为 0,直到它可以在 persist 上获得正确的值。
private Long id = 0L;
问题是这是否可以接受?我担心的是更改 hashCode 不好,但它必须比 NPE 更好?
您应该修复您的 hashCode 以处理空值。
如果您将 id 设置为 0,则它不会在持久化时更改。
请注意,JPA 使用 Java 默认值。
如果您的 ID 是包装器,则新实体的 ID 必须为空。
如果您的 ID 是 int/long/etc,那么默认值必须是 0、0L 等
如果您将 ID Long 设置为 0,JPA 将理解数据库中有一个 ID = 0 的实体,并且可能会说您的实体已分离。
我有一个带有自动递增 ID 的简单实体。
@Entity
public class MyEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
这有一个为我生成的 hashCode 方法。
@Override
public int hashCode()
{
return (int) (id ^ (id >>> 32));
}
问题是我正在尝试向此 class 添加审核,但它在实体持久化之前调用 hashCode,因此 id 为空。
我的解决方案(有效)是将 id 初始化为 0,直到它可以在 persist 上获得正确的值。
private Long id = 0L;
问题是这是否可以接受?我担心的是更改 hashCode 不好,但它必须比 NPE 更好?
您应该修复您的 hashCode 以处理空值。 如果您将 id 设置为 0,则它不会在持久化时更改。
请注意,JPA 使用 Java 默认值。
如果您的 ID 是包装器,则新实体的 ID 必须为空。
如果您的 ID 是 int/long/etc,那么默认值必须是 0、0L 等
如果您将 ID Long 设置为 0,JPA 将理解数据库中有一个 ID = 0 的实体,并且可能会说您的实体已分离。