私はHibernateを学ぼうとしていますが、2つのクラスが相互に関連しています。人と住所。PersonはAddressオブジェクトを構成し、dbPersonテーブルにはaddress_id列があります。
基本的に:
1)テーブルPersonには列があります:id、name、age、address_id 2)テーブルアドレスには列があります:id、street、city
私が観察しているのは、レコードを挿入すると、Personテーブルにid = 1、Addressテーブルにid = 2が使用されることです。したがって、同じシーケンスからPKを生成するように見えます。実際にはすべてが機能していますが、なぜそれがそのようなのか、なぜアドレステーブルでid = 1を使用しないのですか?
コードは次のようになります。
@Entity
public class Person {
public Person(){
}
public Person(String name, int age, Adress adress){
this.name = name;
this.age = age;
this.adress = adress;
}
@Id
@GeneratedValue
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "AGE")
private int age;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="address_id")
private Adress adress;
}
別のクラスは次のとおりです。
@Entity
public class Adress {
@GeneratedValue
@Id
private int id;
@Column(name = "STREET")
private String street;
@Column(name = "CITY")
private String city;
public Adress(){
}
public Adress(String street, String city){
this.street = street;
this.city = city;
}
そして、私はsaveメソッドを次のように呼び出しています:
private static void addPerson(SessionFactory sessionFactory){
Adress adress = new Adress("Wroclawska", "Krakow");
Person person = new Person("Cemal Inanc", 31, adress);
Transaction tx = null;
Session session = null;
try {
session= sessionFactory.openSession();
tx = session.beginTransaction();
session.save(person);
tx.commit();
}
catch (Exception e){
tx.rollback();
System.out.println("Exeception occured");
}
finally {
session.close();
}
}
デフォルトのジェネレータ戦略を使用しているので、オラクルの場合はシーケンスです。
内部的には、データベースにシーケンスを作成し、そのシーケンスから値を取得します。
ここで、両方のエンティティに対して個別のシーケンスを取得する必要があります。指定する必要があります
@SequenceGenerator()
コードに加える必要のある変更:
個人エンティティの場合
@Entity
public class Person {
@Id
GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GeneratorName")
@SequenceGenerator(name="GeneratorName", sequenceName = "seq1")
private int id;
}
住所エンティティの場合
@Entity
public class Adress {
@Id
GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GeneratorName")
@SequenceGenerator(name="GeneratorName", sequenceName = "seq2")
private int id;
}
これらの変更を適用すると、1から始まる両方のIDが取得されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加