【问题标题】:How to give Trigger generated value into Hibernate ValueObject?如何将触发器生成的值赋予 Hibernate ValueObject?
【发布时间】:2012-10-26 10:50:15
【问题描述】:

在我的 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;
 }

在我的服务类中我是这样写的

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()

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

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    如果您使用触发器,则预期的生成策略是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 的 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

    【讨论】:

    • @GeneratedValue( strategy = "trigger" ) 给出编译错误Type mismatch: cannot convert from String to GenerationType 如何解决这个问题?
    • @GeneratedValue 中有错误。正确的是:@GeneratedValue(strategy = "trigger") 也应该是:@Parameter(name="keys", value="userName") 应该是:@Parameter(name="key", value="userName")
    【解决方案2】:

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

    将一些东西设置为 ID 值或尝试一些东西 @GeneratedValue(strategy = GenerationType.IDENTITY)

    【讨论】:

      【解决方案3】:

      正如@vinit 所说:

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

      是最好的选择……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-02
        • 2015-05-28
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多