3

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

実際、列の一意のIDを生成するためにテーブルtrigger用に作成した私のデータベースは、トリガーの問題です..私に提案してください..users_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;

もう 1 つは、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列はnullにしないでください。データベースドライバーで何をしても、挿入またはその他の操作の前後にのみトリガーされますが、エラーによると、エラーの前にエラーが発生しています。

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 に答える