3

在我的休眠应用程序中,我正在使用创建一个 ValueObject 类

@Entity
@Table(name="user")
public class UserVO{

    @Id
    @Column(name="S_ID")
    private String s_id;

    @Column(name="FIRSTNAME")
    private String firstName;

    @Column(name="LASTNAME")
    private String lastName;
 }

在我的服务课上我这样写

public void createOrUpdateUser(UserVO userVO) {
        userDAO.createOrUpdateUser(userVO);
    }

在我的 DAO 课上,我是这样写的

private EntityManager entityManager;
public void createOrUpdateUser(UserVO userVO) throws DataAccessException {
        entityManager.persist(userVO);
    }

现在我正在调用 createOrUpdateUser(userVO) 但它给出了错误

Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()

实际上我的数据库我已经为表创建了一个trigger为列user生成唯一 ID 的数据库,s_id这是触发器的任何问题..请建议我..

4

3 回答 3

6

如果您使用触发器,则预期的生成策略是org.hibernate.id.SelectGenerator. 但是,为了使用这种策略,Hibernate 必须能够在插入后定位插入的行,以查看触发器分配的值有 2 种方法可以做到这一点。

首先是专门配置生成器以告诉它在表中定义唯一键(至少在逻辑上)的列:

@Id
@Column(name="S_ID")
@GeneratedValue( strategy = "trigger" )
@GenericGenerator( 
    name="trigger", strategy="org.hibernate.id.SelectGenerator",
    parameters = {
        @Parameter( name="keys", value="userName" )
    }
)
private String s_id;

private String userName;

另一个是通过 Hibernate 的 natural-id 支持:

@Id
@Column(name="S_ID")
@GeneratedValue( strategy = "trigger" )
@GenericGenerator( name="trigger", strategy="org.hibernate.id.SelectGenerator" ) )
private String s_id;

@NaturalId
private String userName;

GenerationType.IDENTITY 可能适合您。它将真正归结为 JDBC 驱动程序以及它如何(如果)实现getGeneratedKeys

于 2012-10-26T14:28:00.417 回答
3

ID 列不能为空,无论您在数据库驱动程序中做什么,只会在插入或任何其他操作之前/之后触发,但根据错误它会在任何错误之前给出错误。

将某些内容设置为 ID 值或尝试某些内容 @GeneratedValue(strategy = GenerationType.IDENTITY)

于 2012-10-26T13:26:36.983 回答
0

正如@vinit 所说:

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name="S_ID")
private String s_id;

是最好的选择...

于 2012-10-26T13:36:40.540 回答