2015-08-26 5 views
2

Я работаю над существующей базой данных и создал объекты Hibernate. Проблематичным объектом является OrderHeader, в котором есть список OrderLine. Вот мое картографирование:Hibernate не обновляет и не удаляет, но вставляет

@Entity 
@Table(name = "orderline") 
public class OrderLine implements Serializable { 

@Id 
@Column(name = "OrderLineID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
Integer orderLineID; 

@ManyToOne 
@NotNull 
OrderHeader orderHeader; 
} 

... 

@Entity 
@Table(name = "orderheader") 
public class OrderHeader implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "OrderHeaderID") 
int orderHeaderId; 

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
List<OrderLine> orderLineList; 
} 

Все операции выполняются на отдельных объектах. Когда я использую session.save, чтобы вставить новый OrderHeader со списком OrderLine все отлично. Однако при вызове session.update на отдельном измененном OrderHeader единственным исполняемым оператором SQL является оператор выбора, получающий результат обновления (что не произошло в первую очередь). Это становится еще хуже, когда я пытаюсь удалить OrderHeader - несмотря на то, что он установил CascadeType.ALL и orphanRemoval = true на соединение при вызове session.delete hibernate обновляет OrderLine s в списке, установив OrderHeaderID как null, что вызывает исключение.

DDL для обеих таблиц содержит только простые определения данных с помощью простого простого первичного ключа. Каждая операция DAO выполняется в недействительном сеансе.

Может быть, я что-то упустил? Аннотации отношений выглядят нормально, я уверен, что использую правильные методы для доступа к базе данных (хотя я пробовал все там). У меня буквально закончились варианты. Любые советы приветствуются, спасибо

EDIT: Обновление определения, теперь я получаю ERROR org.hibernate.util.JDBCExceptionReporter - Table 'dbname.orderheader_orderline' doesn't exist

ответ

3

1 - Ваша задача, очевидно, отображение @OneToMany, который должен выглядеть следующим образом:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="orderHeader") 
List<OrderLine> orderLineList; 
  • mappedBy, чтобы сообщить JPA, что это двунаправленное отношение
  • no @JoinColumn: оно уже установлено в @ManyToOne

2 - то сказал, держать каскадирование и прочее только на @OneToMany и удаления:

(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 

из @ManyToOne ..

EDIT вот что ваш код должен выглядеть следующим образом: @ManyToOne с @JoinColumn ... и @OneToMany со свойством mappedBy

@Entity 
@Table(name = "orderline") 
public class OrderLine implements Serializable { 

@Id 
@Column(name = "OrderLineID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
Integer orderLineID; 

@ManyToOne 
@JoinColumn(name = "OrderHeaderID") 
OrderHeader orderHeader; 
} 

... 

@Entity 
@Table(name = "orderheader") 
public class OrderHeader implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "OrderHeaderID") 
int orderHeaderId; 

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="orderHeader") 
List<OrderLine> orderLineList; 
} 
+0

Хорошо, я оставил только '@ ManyToOne' аннотацию на' стороне OrderLine' и ЛЕФ t '@OneToMany (fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)' на стороне 'OrderHeader', но теперь я получаю JDBCException при удалении - таблица 'dbname.orderheader_orderline' не существует – Ghostli

+0

вы добавить, что MappedBy значение? ... можете ли вы снова отправить исправленный код? – Pras

+0

опубликовал обновленную версию, должен ли mappedBy ссылаться на имя класса или таблицы? – Ghostli

Смежные вопросы