保存后,JPA CrudRepository save()不填充主键

时间:2019-08-24 07:41:22

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

我这里有一个很奇怪的问题。我在实体中使用@IdClass的复合主键。除保存外,它在每种情况下都可以正常工作。保存实体后,JPA不会触发SELECT查询来选择插入的数据,也不会合并结果。尽管数据已成功保存到数据库中。也没有错误。以下是一些有助于调试问题的代码:

AbstractEntity.java

@MappedSuperclass
@IdClass(PrimaryKey.class)
public abstract class AbstractEntity implements Serializable {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = -1191422925622832672L;

    /** The id. */
    private String id;

    ...

    /**
     * Gets the id.
     *
     * @return the id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public String getId() {
        return id;
    }

    ...
}

PrimaryKey.java

public class PrimaryKey implements Serializable {

    /** The id. */
    private String id;

    /**
     * Gets the id.
     *
     * @return the id
     */
    @Column(name = "id")
    @Convert(converter = CryptoConverter.class)
    public String getId() {
        return id;
    }

    ...
}

User.java

@Entity
@Table(name = "user")
public class User extends AbstractEntity {
    ...
}

UserRepository.java

@Repository
public interface UserRepository extends CrudRepository<User, PrimaryKey> {
}

我在数据库中有BigInt autoIncrement个ID作为主键。但是我想以加密的形式将其公开给外界,所以我使用@Converter对其进行加密和解密。

当我从userRepository.save(userEntity)调用UserService时,它会保留数据,但不会从数据库返回生成的ID。

如何解决此问题?

编辑: 我已经托管了具有此功能here的演示项目。

1 个答案:

答案 0 :(得分:0)

由于我在代码中看不到任何地方,因此需要指定Id,策略类型和数据库上的列。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "applicant_id")