JPA - 可以将id默认为0吗?

时间:2015-03-20 00:48:23

标签: java jpa hashcode

我有一个带有自动递增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));
}

问题是我试图将审计添加到此类,但它在实体持久化之前调用hashCode,因此id为null。

我的解决方案(可行)是将id初始化为0,直到它能够在持久化时获得正确的值。

private Long    id = 0L;

问题是这是否可以接受?我的担心是改变hashCode不好但是它必须比NPE更好?

2 个答案:

答案 0 :(得分:3)

您应该修复hashCode以处理空值。 如果将id设置为0,则在持久化时不会更改。

答案 1 :(得分:2)

请注意,JPA使用Java默认值。

如果您的ID是包装器,则新实体的ID必须为null。

如果您的ID是int / long / etc,则默认值必须为0,0L等

如果您将ID设置为Long = 0,JPA将理解数据库中存在ID为0的实体,并且可能表示您的实体已分离。