java - 如何从父序列值填充子复合键(Hibernate、JPA)?

标签 java hibernate spring jpa composite-key

我遇到的情况是我有一个名为 Order 的类,并生成了 OrderID :

    @Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_gen")
@SequenceGenerator(name = "seq_gen", sequenceName = "OID_SEQ1")
@Column(name = "ORDER_ID",nullable = false)
public long getOrderId()
{
    return this.OrderId;
}

它还有一个与名为 items 的类/表的一对多映射:

    @OneToMany(fetch = FetchType.LAZY,mappedBy = "orders",targetEntity = Items.class)
public Set<Items> getItems()
{
    return this.items;
}

items 类中有一个嵌入/复合 ID:

    @EmbeddedId
@AttributeOverrides({@AttributeOverride(name = "OrderId",column = @Column(name = "ORDER_ID",nullable = false)),
        @AttributeOverride(name = "role",column = @Column(name = "ROLE",nullable = false,length = 10))})
public ItemId getId()
{
    return this.id;
}

我的问题是这个id的一部分是父Order.class的主键。换句话说,序列值。这意味着我无法在任何地方以及当我调用时设置此值:

entitymanager.persist(order);

父 Order 对象写入数据库,但 Set 中的任何项目都不会保留。只有一条insert语句,Items对象中对orderId的引用全部为null???

如何使用生成的 Seq ID 填充这些 ID?

非常感谢您对此提供的任何帮助!

最佳答案

最终在另一篇文章的帮助下解决了这个问题: onetomany-and-composite-primary-keys 答案其实很简单。我们需要使用 Casade 注释将 Id 级联到子对象。所以上面的一对多映射就变成了:

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "orders",targetEntity = Items.class) public Set<Items> getItems() {     return this.items; } 

在实现此审查时,不同的级联类型。

祝你好运

关于java - 如何从父序列值填充子复合键(Hibernate、JPA)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850525/

相关文章:

database - 正确关闭 Hibernate 事务

java - 仅在保存实体时制作 transient 列

java - Spring AOP自定义注解,使用注解参数获取Null

java - 我怎么知道是什么阻止了 spring webapp 的关闭

spring - ehcache配置中的diskSpoolBufferSizeMB是什么意思?

java - 如何使用查询注释删除 MongoRepository 中的项目?

java - 存储值不起作用?

java - 拦截 onOptionsItemSelected

java - StringBuilder.append 内存不足

java - 标记非数据库字段 @Transient 与范围 JPA 实体?