我正在使用Hibernate和Java来实现数据库。
我创建了以下两个注释:
@Entity public class Cargo implements Serializable{
@Id
@GeneratedValue
private Long id;
private String cargo;
@OneToOne(mappedBy="cargo")
private Funcionario funcionario;
}
和
@Entity public class Funcionario implements Serializable{
@Id @GeneratedValue private Long id;
private String nome;
private String sexo;
private String telefone;
@OneToOne
private Cargo cargo;
}
然后,我尝试使用以下代码插入数据:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("BD04PU");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();
Cargo novoCargo = new Cargo();
Funcionario novoFuncionario = new Funcionario();
Scanner entrada = new Scanner(System.in);
System.out.print("\nCargo: ");
novoCargo.setCargo(entrada.nextLine());
manager.persist(novoCargo);
System.out.print("\nNome: ");
novoFuncionario.setNome(entrada.nextLine());
System.out.print("\nSexo: ");
novoFuncionario.setSexo(entrada.nextLine());
System.out.print("\nTelefone: ");
novoFuncionario.setTelefone(entrada.nextLine());
novoFuncionario.setCargo(novoCargo);
manager.persist(novoFuncionario);
manager.getTransaction().commit();
factory.close();
但是结果是,Cargo和Funcionario的外键计算如下:Cargo以1开头,而Funcionario以2开头,然后Cargo主键变为3,而Funcionario主键变为4。
好像两个主键都一样。
为什么会这样?如何解决?
在上方,货物编号应在Funcionario表中用作外键。
最佳答案
您正在两个实体中重复使用相同的序列,以将它们分开,您可以使用
@Entity
public class Cargo implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cargo_generator")
@SequenceGenerator(name="cargo_generator", sequenceName = "cargo_seq", allocationSize=50)
private Long id;
private String cargo;
@OneToOne(mappedBy="cargo")
private Funcionario funcionario;
}
和
@Entity
public class Funcionario implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "funcionario_generator")
@SequenceGenerator(name="funcionario_generator", sequenceName = "funcionario_seq", allocationSize=50)
private Long id;
private String nome;
private String sexo;
private String telefone;
@OneToOne
private Cargo cargo;
}
如果要手动创建模式,则必须定义以下序列:
cargo_seq
和funcionario_seq
。