Jav*_*per 3 java mysql hibernate
在我的 Hibernate 应用程序中,我正在使用创建一个 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;
}
Run Code Online (Sandbox Code Playgroud)
在我的服务课上我是这样写的
public void createOrUpdateUser(UserVO userVO) {
userDAO.createOrUpdateUser(userVO);
}
Run Code Online (Sandbox Code Playgroud)
在我的 DAO 课上我是这样写的
private EntityManager entityManager;
public void createOrUpdateUser(UserVO userVO) throws DataAccessException {
entityManager.persist(userVO);
}
Run Code Online (Sandbox Code Playgroud)
现在我正在调用 createOrUpdateUser(userVO) 但它给出了错误
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
Run Code Online (Sandbox Code Playgroud)
其实我的数据库我已创建了一个trigger
用于user
表来生成唯一ids_id
为trigger..please建议我列是他们的任何问题..
如果您使用触发器,则预期的生成策略是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;
Run Code Online (Sandbox Code Playgroud)
另一种是通过 Hibernate 的自然 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;
Run Code Online (Sandbox Code Playgroud)
GenerationType.IDENTITY 可能适合您。它将真正归结为 JDBC 驱动程序以及它如何(如果)实现getGeneratedKeys
ID列不能为空,无论您在数据库驱动程序中做什么,都只会在插入或任何其他操作之前/之后触发,但根据错误,它会在任何错误之前给出错误。
将某些内容设置为 ID 值或尝试某些内容
@GeneratedValue(strategy = GenerationType.IDENTITY)