gpt4 book ai didi

java - Hibernate,自动持久化依赖对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:58 27 4
gpt4 key购买 nike

我是 Hibernate 的新手,一直在尝试确定它能为您做什么以及它需要您做什么。

一个大的对象正在处理一个对象,该对象具有数据库中尚不存在的依赖项。例如,我有一个 Project 对象,其中包含接受 Manufacturer 对象作为其值的 Manufacturer 字段。在数据库中,我有一个带有 mfr_id 列的产品表,该列是对制造商表的引用(一种相当典型的单向一对多关系)。

如果分配给产品对象的制造商与数据库中已有的制造商相关,则没有问题。但是,当我尝试保存或更新引用尚未保留的制造商的对象时,操作失败并出现异常。

Exception in thread "Application" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

我当然可以手动检查产品制造商的状态,方法是查看它的 ID 字段是否为空,如果是则保存它,但这似乎是一个麻烦的解决方案。如果相关依赖项尚未持久化,Hibernate 是否支持自动持久化依赖项?如果是这样,我如何启用该行为?我正在使用与 Netbeans(我相信是 3.5)捆绑在一起的 Hibernate 版本和用于指定映射行为的内联注释。下面是我的产品和制造商类,缩减为处理依赖性的部分。 (Product extends Sellable 映射到一个sellable表,使用JOINED作为继承策略就是那个包含标识产品的主键的表)

@Entity
@Table (
name="products",
schema="sellable"
)
public abstract class Product extends Sellable {
private Manufacturer manufacturer;

@ManyToOne (fetch = FetchType.EAGER)
@JoinColumn (name = "mfr_id")
public Manufacturer getManufacturer () {
return this.manufacturer;
}

/**
*
* @param manufacturer
*/
public Product setManufacturer (Manufacturer manufacturer) {
this.manufacturer = manufacturer;
return this;
}
}

依赖制造商

@Entity
@Table (
name="manufacturers",
schema="sellable",
uniqueConstraints = @UniqueConstraint(columnNames="mfr_name")
)
public class Manufacturer implements Serializable {
private Integer mfrId = null;
private String mfrName = null;

@Id
@SequenceGenerator (name = "manufacturers_mfr_id_seq", sequenceName = "sellable.manufacturers_mfr_id_seq", allocationSize = 1)
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "manufacturers_mfr_id_seq")
@Column (name="mfr_id", unique=true, nullable=false)
public Integer getMfrId () {
return mfrId;
}

private Manufacturer setMfrId (Integer mfrId) {
this.mfrId = mfrId;
return this;
}

@Column(name="mfr_name", unique=true, nullable=false, length=127)
public String getMfrName () {
return mfrName;
}

public Manufacturer setMfrName (String mfrName) {
this.mfrName = mfrName;
return this;
}
}

更新:我尝试了来自 this question 的以下内容,但我仍然得到 transient 对象异常。

@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})

我还检查了 Netbeans 捆绑的 Hibernate 版本,是 3.2.5

更新 2:我发现以下内容显然可以按我的意愿工作。

@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)

但是,我怀疑这不是我真正想要的级联类型。如果我删除了一个产品,我认为删除它的关联制造商不是正确的行为,我相信现在会发生这种情况。

我确实尝试创建一个包含所有可用类型的级联类型,但这也没有用。当我试图保存一个与未保存的制造商关联的产品时,我遇到了同样的异常。

@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})

我在好几个地方都提到过 CascadeType.SAVE_UPDATE,但是这种模式在 Netbeans 附带的 Hibernate 版本中似乎不可用。

最佳答案

你得看看级联操作;这种类型的操作允许您管理内部对象尊重其父对象的生命周期。

@ManyToOne(cascade)如果你使用 Session.persist() 操作或者 org.hibernate.annotations.@Cascade 如果你不使用 JPA 函数 Session.saveOrUpdate() .

这只是一个例子,完整的文档点here

对于您的代码,如果您想在保存 Project 时自动保存 Manufacturer,请使用:

@ManyToOne (fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.PERSIST})
@JoinColumn (name = "mfr_id")
public Manufacturer getManufacturer () {
return this.manufacturer;
}

@Cascade(CascadeType.PERSIST)

关于java - Hibernate,自动持久化依赖对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com