12

Employeeクラスに次の定義があります

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "employee_id")
private Integer employeeId;

次に、既存の従業員IDを持つ既存の従業員をインポートします。保存する前に従業員IDを設定しても、割り当てられたIDは無視され、自動インクリメントされたIDが保存されます。これをどのようにオーバーライドしますか?

ここで説明した複合キーについても同様の問題がありました

4

4 に答える 4

18

私はこの問題を解決するために独自のジェネレーターを作成しました。

public class UseExistingIdOtherwiseGenerateUsingIdentity extends IdentityGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
        return id != null ? id : super.generate(session, object);
    }
}

次のように使用します:(パッケージ名を置き換えます)

@Id
@GenericGenerator(name = "UseExistingIdOtherwiseGenerateUsingIdentity", strategy = "{package}.UseExistingIdOtherwiseGenerateUsingIdentity")
@GeneratedValue(generator = "UseExistingIdOtherwiseGenerateUsingIdentity")
@Column(unique = true, nullable = false)
protected Integer id;
于 2012-08-02T08:03:47.970 に答える
1

オーバーライドすることはできません。まず第一に、JPAはそれを行う方法を提供していません。2番目の問題は、GenerationType.AUTOが、SQLステートメントを介してユーザーが割り当てた値を受け入れないような列タイプを生成する可能性があることです。

データのインポートを手動で実行し、アプリケーション自体をインポートツールとして使用しないでください。

于 2012-07-26T11:13:04.727 に答える
0

getEmployeeId()メソッドをオーバーライドし、このメソッドでアノテーションを使用する必要があります。この場合、JPAはクラス内のすべてのフィールドにgetterメソッドを使用し、getterメソッドで他のアノテーションを移動する必要があります。

于 2013-09-21T06:54:46.727 に答える
-1

この場合、@MappedSuperclassを使用するのが最適な場合があります

@MappedSuperclass
public AbstractEmployee {
   // declare all properties, getters, setters except for the id
}

@Entity
@Table(name="EMPLOYEE")
public class Employee extends AbstractEmployee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private Integer employeeId;

    ...
}

@Entity
@Table(name="EMPLOYEE")
public class EmployeeWithAssignedId extends AbstractEmployee {
    @Id
    @Column(name = "employee_id")
    private Integer employeeId;

    ...
}

したがって、IDを手動で割り当てる場合は、2番目のクラスを使用します。私はこれをテストしていませんが、あなたの状況でうまくいくはずだと思います。2つのクラスが同じテーブル名を持つことはできないというJPAのルールはないと思います:)

于 2012-07-26T12:44:27.747 に答える