我对 Hibernate 很陌生,并且一直在尝试确定它将为您做什么以及它需要您做什么。
一个大问题是处理一个对象,该对象具有数据库中尚不存在的依赖项。例如,我有一个 Project 对象,其中包含一个接受 Manufacturer 对象作为其值的 Manufacturer 字段。在数据库中,我有一个产品表,其中包含一个 mfr_id 列,该列是对制造商表的引用(一种相当典型的单向一对多关系)。
如果分配给产品对象的制造商与数据库中已经存在的制造商相关,则没有问题。但是,当我尝试保存或更新引用尚未持久化的制造商的对象时,操作失败并出现异常。
线程“应用程序”org.hibernate.TransientObjectException 中的异常:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例
我当然可以通过查看产品的 ID 字段是否为空并保存它来手动检查产品制造商的状态,如果是,但这似乎是一个麻烦的解决方案。如果相关依赖项尚未持久化,Hibernate 是否支持自动持久化依赖项?如果是这样,我该如何启用该行为?我正在使用与 Netbeans 捆绑在一起的 Hibernate 版本(我相信是 3.5)和内联注释来指定映射行为。下面是我的产品和制造商类,减少到处理依赖关系的部分。(Product extends 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;
}
}
更新:我从这个问题尝试了以下,但我仍然得到瞬态对象异常。
@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 版本中似乎没有这种模式。