java - 如何使用 JPA/Hibernate 在 child 的 id 中引用 parent 的 id?

标签 java oracle hibernate jpa

给定一个表( MY_TABLE_A ),它在每次新插入时自动递增其 id(即数据库中的第一条记录的 ID 属性为 1,第二条记录的 ID 属性设置为 2,第三条记录的 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();
<小时/>

详细信息insert()对于头等舱服务:

public void insert() {
        FirstClass obj = new FirstClass();
        getCurrentSession().persist(obj);
}
<小时/>

insert()对于第二类服务:

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;
}

设置级联选项后,您只需调用保存firstClass:关联的secondClass将自动保留 - 假设您在内存模型中设置了关系的两侧,即

firstClass.setSecondClass(secondClass);
secondClass.setFirstClass(firstClass);

关于java - 如何使用 JPA/Hibernate 在 child 的 id 中引用 parent 的 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38838999/

相关文章:

hibernate - 在Grails/GORM中为名称-值对的集合建模

java - 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

java - 如何从继承类调用的抽象类调用抽象方法

java - 使用 Xuggler API 处理视频流

java - JPA:查询实体内的可嵌入列表

sql - Oracle:使用 SQL 或 PL/SQL 在动态 SQL 中查找错误的位置

java - 没有这样的客户端异常 Spring Oauth2

java - SQL如何用一条SQL语句更新表行

oracle - 在 Oracle 10g 中通过数据库链接复制元数据

java - 如何使用 JPA 将各个列映射到集合中