2014-09-16 2 views
1

im new с Hibernate, и у меня есть некоторые проблемы при попытке сохранить объект в базе данных.Hibernate Insert пытается обновить столбец идентификаторов

@Entity 
@Table(name="order") 
public class Order implements Serializable { 
    private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long number; 

@Column(name="date") 
private Timestamp date; 

@Column(name="obs") 
private String obss; 

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL) 
@JoinColumn(name="id", referencedColumnName="number") 
private List <OrderDetail> orderDetail; 

(...) 

и OrderDetail класса

@Entity 
@Table(name="orderDetail") 
public class OrderDetail implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

@Column(name="orderType") 
private Long orderType; 

(...) 

Когда я пытаюсь сохранить объекты в БД я получаю следующее сообщение об ошибке:

Hibernate: 
    insert 
    into 
     order 
     (date, obs, rejectObs, pid, destiny, stateId, userId, version) 
    values 
     (?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: 
    insert 
    into 
     OrderDetail 
     (boxId, date, digitalid, documentId, rejectObs, obs, orderId, stateId, orderType) 
    values 
     (?, ?, ?, ?, ?, ?, ?, ?, ?,) 
Hibernate: 
    update 
     OrderDetail 
    set 
     id=? 
    where 
     id=? 
16/09/2014 11:50:03 org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 8102, SQLState: S1000 
16/09/2014 11:50:03 org.hibernate.util.JDBCExceptionReporter logExceptions 
ERROR: Cannot update identity column 'id'. 
16/09/2014 11:50:03 org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
GRAVE: Could not synchronize database state with session 
org.hibernate.exception.GenericJDBCException: could not insert collection: [com.sa.ra.entities.Order.orderDetail#4252] 

Я не знаю, почему Hibernate пытается обновить OrderDetail Таблица. Кто-нибудь говорит, что происходит? im using SQL Server 2008 и hibernate 3.5.0

ответ

0

Существует ошибка концепции.

Вы запрашиваете спящий режим для ссылки на два объекта, используя их идентификатор как первичный ключ, так и внешний ключ друг от друга. Это не верно.

Правильный способ поместить два объекта в отношение «один ко многим» - это добавить внешний ключ на стороне «много», который должен ссылаться на первичный ключ класса «один». Это вопрос базы данных, это не только ограничение спящего режима.

Вы можете прочитать больше о Hibernate Коллекции here

Согласно вышеуказанной документации, вы должны изменить код следующим образом:

«один» сторона

@Entity 
@Table(name="order") 
public class Order implements Serializable { 
    [...] 
    @OneToMany(targetEntity = OrderDetail.class, cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.LAZY) 
    private List <OrderDetail> orderDetail; 
    [...] 
} 

Затем «много»:

@Entity 
@Table(name="orderDetail") 
public class OrderDetail implements Serializable { 
    [...] 
    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) 
    @JoinColumn(name = "order_id", nullable = false) 
    private Order order; 
    [...] 
} 
+0

Thx! это сработало. Отлично. –

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