64

私はJPAを学んでいて、@SequenceGenerator注釈に混乱があります。

私の理解では、エンティティの数値 ID フィールド/プロパティに値が自動的に割り当てられます。

Q1. このシーケンス ジェネレーターは、データベースの増加する数値生成機能を利用しますか、それとも独自に数値を生成しますか?

Q2. JPA がデータベースの自動インクリメント機能を使用している場合、自動インクリメント機能を持たないデータストアでも動作しますか?

Q3. JPA が独自に数値を生成する場合、JPA 実装は次に生成する値をどのように知るのでしょうか? 値 (最後 + 1) を生成するために、最後に保存された値を確認するために、最初にデータベースに問い合わせますか?


Q4. また、注釈のいくつかの光sequenceNameallocationSizeプロパティを当ててください。@SequenceGenerator

4

5 に答える 5

69

sequenceNameDB 内のシーケンスの名前です。これは、DB に既に存在するシーケンスを指定する方法です。この方法をallocationSize使用する場合は、DB シーケンスが「自動インクリメント」として使用するのと同じ値にする必要がある を指定する必要があります。

使用法:

@GeneratedValue(generator="my_seq")
@SequenceGenerator(name="my_seq",sequenceName="MY_SEQ", allocationSize=1)

必要に応じて、シーケンスを作成することができます。ただし、これを行うには、SchemaGeneration を使用して作成する必要があります。これを行うには、次を使用します。

@GeneratedValue(strategy=GenerationType.SEQUENCE)

また、テーブルを使用して ID を生成する自動生成を使用することもできます。この機能を使用する場合、ジェネレータ テーブルを作成できるように、ある時点で SchemaGeneration も使用する必要があります。これを行うには、次を使用します。

@GeneratedValue(strategy=GenerationType.AUTO)
于 2010-04-07T19:13:17.140 に答える
15

私はこれを使用し、正しく動作します

@Id
@GeneratedValue(generator = "SEC_ODON", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "SEC_ODON", sequenceName = "SO.SEC_ODON",allocationSize=1)
@Column(name="ID_ODON", unique=true, nullable=false, precision=10, scale=0)
public Long getIdOdon() {
    return this.idOdon;
}
于 2013-08-05T23:06:59.420 に答える
6

autogen 値を持つ MySQL スキーマがあります。私はstrategy=GenerationType.IDENTITYタグを使用しており、MySQL で正常に動作しているようです。ほとんどの db エンジンも動作するはずです。

CREATE TABLE user (
    id bigint NOT NULL auto_increment,
    name varchar(64) NOT NULL default '',
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

User.java:

// mark this JavaBean to be JPA scoped class
@Entity
@Table(name="user")
public class User {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;    // primary key (autogen surrogate)

    @Column(name="name")
    private String name;

    public long getId() { return id; }
    public void setId(long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name=name; }
}
于 2013-03-26T19:44:39.457 に答える