在我的Hibernate Application中,我正在使用创建一个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
来生成s_id
列的唯一ID,这是他们触发的任何问题。请建议我..
答案 0 :(得分:4)
如果您使用触发器,则预期的生成策略为org.hibernate.id.SelectGenerator
。但是,为了使用这种策略,Hibernate必须能够在插入后找到插入的行,以查看分配的触发器的值有两种方法。
首先是专门配置生成器告诉它在表中定义唯一键(至少在逻辑上)的列:
@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的自然支持:
@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
答案 1 :(得分:3)
ID列不能为空,无论你在数据库驱动程序中做什么,只会在插入之前/之后或任何其他操作时触发,但根据错误,它会在出现任何错误之前给出错误。
将某些内容设置为ID值或尝试某些内容
@GeneratedValue(strategy = GenerationType.IDENTITY)
答案 2 :(得分:0)
正如@vinit所说:
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name="S_ID")
private String s_id;
是最好的选择...