Гибернация, автоматически сохраняются зависимые объекты
Я довольно новичок в Hibernate и пытался определить, что он сделает для вас и что он требует от вас.
Большой имеет дело с объектом, у которого есть иждивенцы, которые нет еще существует в базе данных. Например, у меня есть объект Project, который включает в себя поле «Производитель», которое принимает объект «Производитель» в качестве значения. В базе данных у меня есть таблица продуктов со столбцом mfr_id, который 's ссылка на таблицу производителей (довольно типичное однонаправленное отношение «один ко многим»).
Если производитель, назначенный объекту продукта, относится куже в базе данных, то естьНет проблем. Тем не менее, когда я пытаюсь сохранить или обновить объект, который ссылается на производителя, который неЕсли операция не завершена, операция завершается с исключением.
Исключение в теме "Заявка" org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом
Конечно, я могу вручную проверить состояние продукта ».производитель, посмотрев,Поле идентификатора равно нулю и сохраняет его, если оно есть, но это кажется громоздким решением. Поддерживает ли Hibernate автоматически сохраняющихся зависимых, если рассматриваемый зависимый не 'Т еще сохранились? Если так, как я могу включить это поведение? Я'используя версию Hibernate в комплекте с Netbeans (я полагаю, 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;
}
}
Зависимый производитель
@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})
Я также проверил, какая версия Hibernate входит в комплект Netbeans,с 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, упомянутый в нескольких местах, но этот режим неПохоже, что он доступен в версии Hibernate, которая поставляется с Netbeans.