Gor*_*onM 6 java orm hibernate cascade
我对Hibernate很陌生,一直试图确定它将为你做什么以及它需要你做什么.
一个重要的是处理具有数据库中尚不存在的依赖项的对象.例如,我有一个Project对象,其中包含一个Manufacturer字段,该字段接受Manufacturer对象作为其值.在数据库中,我有一个带有mfr_id列的产品表,该列是对manufacturer表的引用(一种相当典型的单向一对多关系).
如果分配给产品对象的制造商与已经存在于数据库中的制造商有关,则没有问题.但是,当我尝试保存或更新引用尚未持久化的制造商的对象时,操作将失败并出现异常.
线程"Application"中的异常org.hibernate.TransientObjectException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例
我当然可以手动检查产品制造商的状态,看看它的ID字段是否为空,如果是,则将其保存,但这似乎是一个麻烦的解决方案.如果尚未保留相关的依赖项,Hibernate是否支持自动持久的依赖项?如果是这样,我该如何启用该行为?我正在使用与Netbeans捆绑的Hibernate版本(我相信3.5)和用于指定映射行为的内联注释.以下是我的产品和制造商类,减少了处理依赖关系的部分.(产品扩展为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;
}
}
Run Code Online (Sandbox Code Playgroud)
依赖制造商
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我从这个问题尝试了以下内容,但我仍然得到瞬态对象异常.
@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
Run Code Online (Sandbox Code Playgroud)
我还检查了Netbeans捆绑了哪个版本的Hibernate,它是3.2.5
更新2:我发现以下似乎显然按我的意愿工作.
@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这不是我真正想要的级联类型.如果我删除了一个产品,我不认为删除其相关的制造商是正确的行动,这是我认为现在会发生的.
我确实尝试创建一个由所有可用类型组成的级联类型,但这也没有用.当我尝试保存一个与未关联的制造商相关联的产品时,我遇到了同样的异常.
@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
Run Code Online (Sandbox Code Playgroud)
我已经在几个地方看到过CascadeType.SAVE_UPDATE,但在Netbeans附带的Hibernate版本中似乎没有这种模式.
你必须看看级联操作; 这种类型的操作允许您管理内部对象的生命周期,尊重其父级.
@ManyToOne(级联)如果您使用Session.persist()
操作或org.hibernate.annotations.@Cascade
不使用JPA功能Session.saveOrUpdate()
.
这只是一个例子,这里有完整的文档点
对于您的代码,如果您想Manufacturer
在保存Project
使用时自动保存:
@ManyToOne (fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.PERSIST})
@JoinColumn (name = "mfr_id")
public Manufacturer getManufacturer () {
return this.manufacturer;
}
Run Code Online (Sandbox Code Playgroud)
要么
@Cascade(CascadeType.PERSIST)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16874 次 |
最近记录: |