2012-01-07 5 views
1

私は2つのエンティティpersonStudentを持っています。生徒エンティティはpersonを拡張し、独自の識別子studentNumberを持っています。新しい生徒を作るときは、両方の識別番号を自動生成したいと思う。SINGLE_TABLE継承モデルのperson_idとstudent_idを自動生成

次のスニペットはで失敗:私は新しい学生を作成する場所を学生NULL

@RooEntity(identifierColumn = "personID", inheritanceType = "SINGLE_TABLE") 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20) 
@DiscriminatorValue("P") 
public class Person { 
} 

いるエンティティ

@RooEntity 
@DiscriminatorValue("S") 
public class Student extends Person { 


    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "studentNumber") 
    private long studentNumber; 
} 

はここでPERSON_IDと学生数が生成されますが、PERSONIDではないでしょうか?

private Student student; 

    /** 
    * @method Create a new student using our persistence model---Not Null variables 
    */ 

    public void CreateNewStudent(String firstName, String lastName, String telephone, Date birthday, GenderType gender){ 


     student = new Student(); 
     //set our variables and persist 
     student.setFirstName(firstName); 
     student.setLastName(lastName); 
     student.setTelephone(telephone); 
     student.setBirthDay(birthday); 
     student.setGender(gender); 

     student.persist(); 
    } 
} 

生徒の作成時にstudentNumberとpersonIDの両方を作成する方法はありますか?

+0

このデザインには質問があります。単一のテーブル継承を使用すると、親テーブルと派生テーブルの両方に主キーがあるのはなぜですか?あなたのスキーマを示してください。 – Perception

+0

学生番号は本当に特定のレコードを識別するためのものではなく、学生の身元を表す数字、人IDが唯一のプライマリキーでなければなりません – Warz

+0

ああ大丈夫です。 – Perception

答えて

0

フォローアップコメントに基づいて、Personの主キーIDと、Studentの一意のIDが必要です。現在の設定では、キーのうちの1つのみが自動生成されます(多くのDBMSでは、テーブルごとに1つの列を自動インクリメントすることができます)。だから私は、あなたが最初にPersonのためのあなたの主キー列を定義することをお勧めします:

@Entity 
@Table(name="person") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING,length=20) 
@DiscriminatorValue("P") 
public class Person { 
    @Basic 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="personId") 
    private Long id; 
} 

注あなたのDBにあなたは自動インクリメントとしてPERSONID列を持つようにしたいということ。次に、学生番号のために別々に生成された値の注釈を定義します。私は以下を示し例では、テーブル・ジェネレータを使用しますが、あなたがやりたいことができます。

create table identifier_table (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    seq_name VARCHAR(255) NOT NULL, 
    seq_count INT NOT NULL DEFAULT 0 
); 
:上記の例を考えると、相続人

@Entity 
@DiscriminatorValue("S") 
public class Student extends Person { 
    @Basic 
    @TableGenerator(name="ID_GEN", table="identifier_table", pkColumnName="seq_name", 
     valueColumnName="seq_count", pkColumnValue="student_seq") 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ID_GEN") 
    @Column(name = "studentNumber") 
    private Long studentNumber; 
} 

あなたが学生のためのシーケンス番号の生成をサポートする必要がありますテーブルのDDL

そして、あなたが最初にそれを移入します:もちろん

insert into identifier_table (seq_name, seq_count) VALUES ('student_seq', 0); 

を、簡単な解決策は、あなただけのfolloを行うことができ、文字列としてあなたの学生の識別子のを宣言するだろう翼、はるかに簡単セットアップ:

public class Student extends Person { 
    @Basic 
    @NotNull 
    @Column(name = "studentId") 
    private String studentIdentifier; 
} 

、各レコードを保存する前には、UUIDクラスで学生のIDを設定します。

aStudent.setStudentIdentifier(UUID.randomUUID().toString()); 

・ホープ、このことができます。

+0

学生識別子がUUIDで作成される、より簡単なソリューションです。randUUID()、これは本当にユニークですか?私は乱数ex.10000で始めることができる方法はありますか?その後、人のテーブルに追加された新しい生徒ごとに1ずつ増分しますか? – Warz

+0

UUIDについて詳しくは、Oracle javadocページ(http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html)を参照してください。しかし、言うまでもなく、それはかなり独特なものです。世界的に。 – Perception

+0

最後に、createNewStudent()メソッドを変更して生徒ではなく生徒のエンティティを作成する場合、学生エンティティに言及した変更を加えたデータベースで人物のIDを生成するべきですか? – Warz

0

現在のところ、GenerateValueは1つしか作成できないと思います。 2つを必要とする場合は、継承を使用しない、つまりPersonに1-1のStudentInfoがあるか、または他のIDをイベントまたはアプリケーションに割り当てることができます。新しい生成されたIDを取得するために、EclipseLinkセッションにAPIがあります。

+0

IDを生成するEclipseLinkセッションでAPIへのリンクを投稿してください。 – Warz

+0

http://www.eclipse.org/eclipselink/api/2.3/org/eclipse/persistence/sessions/Session.html#getNextSequenceNumberValue%28java.lang.Class%29 – James

関連する問題