在两个表中使用hibernate的主键
我正在努力学习Hibernate,我有两门课彼此相关;人和地址。Person compose Address对象,db Person表上有Address_id列 基本上: 1) 表Person有以下列:id、name、age、address\u id 2) 表地址包含以下列:id、街道、城市 我观察到的是,当我插入一条记录时,它对Person表使用id=1,对Address表使用id=2。所以它看起来像是从同一个序列生成PK。实际上一切都在工作,但为什么它是这样的,为什么它不在地址表中使用id=1 代码如下所示:在两个表中使用hibernate的主键,hibernate,primary-key,nhibernate-mapping,Hibernate,Primary Key,Nhibernate Mapping,我正在努力学习Hibernate,我有两门课彼此相关;人和地址。Person compose Address对象,db Person表上有Address_id列 基本上: 1) 表Person有以下列:id、name、age、address\u id 2) 表地址包含以下列:id、街道、城市 我观察到的是,当我插入一条记录时,它对Person表使用id=1,对Address表使用id=2。所以它看起来像是从同一个序列生成PK。实际上一切都在工作,但为什么它是这样的,为什么它不在地址表中使用id=
@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;
}
我正在调用另存方法为:
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();
}
}
如果不指定序列名称,Hibernate默认为所有实体使用相同的序列或表 如果要使用序列并且数据库支持,则必须指定生成策略和序列生成器
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence-generator"
)
@SequenceGenerator(
name = "sequence-generator",
sequenceName = "address_sequence"
)
private int id;
在官方Hibernate文档中阅读更多关于此的信息:
如果不指定序列名称,Hibernate默认为所有实体使用相同的序列或表 如果要使用序列并且数据库支持,则必须指定生成策略和序列生成器
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence-generator"
)
@SequenceGenerator(
name = "sequence-generator",
sequenceName = "address_sequence"
)
private int id;
在官方Hibernate文档中阅读更多关于此的信息:
因为您使用了默认的生成器策略,所以对于oracle,它是顺序 在内部,它将在数据库中创建一个序列,并从该序列中获取值 现在,您希望获得两个实体的单独序列。您需要指定
@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;
}
用于地址实体
@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。因为您使用了默认的生成器策略,所以对于oracle,它是顺序 在内部,它将在数据库中创建一个序列,并从该序列中获取值 现在,您希望获得两个实体的单独序列。您需要指定
@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;
}
用于地址实体
@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