给定一个表(MY_TABLE_A
),该表在每次新插入时自动增加其ID(即数据库中的第一条记录的ID属性设置为1,第二条记录的ID属性设置为2,第三条记录的ID属性设置为至3)。我在说的ID是表的主键。
我还有另一个表(MY_TABLE_B
),该表引用原始表的主键。当我尝试将两者都持久保存到Oracle数据库时,我得到一个org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
我要完成的工作:每当我将对象持久保存到MY_TABLE_A
时,我都希望MY_TABLE_B
插入一个具有与MY_TABLE_A
相同的ID的对象,因为它会自动递增(直到知道它的下一个值是多少)插入)。为了明确起见,表A中的一个ID在表B中应该只有一个匹配的ID
以下是我的代码的一些摘要:
头等舱:
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_A")
@Component
public class FirstClass implements Serializable {
@Id
@SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SCHEMA.MY_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
@Column(name = "MY_ID")
private Integer myId;
// more variables, getters/setters
}
二等舱:
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_B")
@SecondaryTable(name = "MY_SCHEMA.MY_TABLE_A", pkJoinColumns = @PrimaryKeyJoinColumn(name = "MY_ID", referencedColumnName = "MY_ID"))
@Component
public class SecondClass {
@Id
@Column(name = "MY_ID")
private Integer myId;
// more variables, getters/setters
}
我在其中为Oracle中的每个服务项插入新条目的服务层代码段:
firstClassService.insert();
secondClassService.insert();
firstClassService的
insert()
上的详细信息:public void insert() {
FirstClass obj = new FirstClass();
getCurrentSession().persist(obj);
}
insert()
用于secondClassService:public void insert() {
SecondClass obj = new SecondClass();
getCurrentSession().persist(obj);
}
更新
FirstClass现在的样子:
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_A")
@Component
public class FirstClass implements Serializable {
@Id
@SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SCHEMA.MY_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
@Column(name = "MY_ID")
@OneToOne(mappedBy = "myId")
private Integer myId;
}
二等舱:
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_B")
@SecondaryTable(name = "MY_SCHEMA.MY_TABLE_B", pkJoinColumns = @PrimaryKeyJoinColumn(name = "MY_ID", referencedColumnName = "MY_ID"))
@Component
public class SecondClass implements Serializable {
@Id
@JoinColumn(name = "MY_ID", referencedColumnName = "MY_ID")
@OneToOne
private Integer restRequestId;
}
最佳答案
映射应如下所示:
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_A")
@Component
public class FirstClass implements Serializable {
@Id
@SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SCHEMA.MY_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
@Column(name = "MY_ID")
private Long myId;
@OneToOne(mappedBy = "firstClass", cascade = CascadeType.ALL)
private SecondClass secondClass;
}
@Entity
@Table(name = "MY_SCHEMA.MY_TABLE_B")
@Component
public class SecondClass implements Serializable {
@Id
@JoinColumn(name = "MY_ID", referencedColumnName = "MY_ID")
@OneToOne
private FirstClass firstClass;
}
设置Cascade选项后,您只需要调用保存firstClass的方法:关联的secondClass将自动持久化-假设您在内存模型中设置了关联关系的两侧,即
firstClass.setSecondClass(secondClass);
secondClass.setFirstClass(firstClass);