2012-06-12 39 views
37
 
Caused by: org.springframework.orm.hibernate3.HibernateSystemException: ids for this class must be manually assigned before calling save(): com.rfid.model.Role; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.rfid.model.Role 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748) 
    at com.wfos.engine.wrapper.domain.impl.WrapperImpl.save(WrapperImpl.java:159) 
    ... 47 more 
    Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.rfid.model.Role 
    at org.hibernate.id.Assigned.generate(Assigned.java:53) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) 
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) 
    at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:751) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419) 
    ... 50 more 
    WARN [21:14:21] (CommonsLoggingOutput.java:59): - --Erroring: batchId[1] message[java.lang.reflect.UndeclaredThrowableException] 

lớp của tôi là như thế này:ids cho lớp này phải được gán bằng tay trước khi gọi tiết kiệm():

@Entity 
@javax.persistence.Table(name="Role") 
@Table(appliesTo = "Role") 
public class Role { 

@Id 
@Column(name="U_id") 
public String U_id; 

public String U_pwd; 

public String U_account; 

public String U_mode; 

public String U_status; 


public String getU_pwd() { 
    return U_pwd; 
} 

public void setU_pwd(String u_pwd) { 
    U_pwd = u_pwd; 
} 

public String getU_account() { 
    return U_account; 
} 

public void setU_account(String u_account) { 
    U_account = u_account; 
} 

public String getU_id() { 
    return U_id; 
} 

public void setU_id(String u_id) { 
    U_id = u_id; 
} 

public String getU_mode() { 
    return U_mode; 
} 

public void setU_mode(String u_mode) { 
    U_mode = u_mode; 
} 

public String getU_status() { 
    return U_status; 
} 

public void setU_status(String u_status) { 
    U_status = u_status; 
} 

} 

Trả lời

54

lớp @Entity của bạn có một loại String cho lĩnh vực @Id của nó, vì vậy nó không thể tạo id cho bạn.

Nếu bạn thay đổi nó vào một increment tự động trong DB và một Long trong java, và thêm @GeneratedValue chú thích:

@Id 
@Column(name="U_id") 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long U_id; 

nó sẽ xử lý thế hệ incrementing id cho bạn.

+2

Tôi bị thiếu: @GeneratedValue (strategy = GenerationType.IDENTITY). Nó đã giúp đỡ tôi. – sns

3

Đối với ngủ đông, điều quan trọng là phải biết rằng đối tượng của bạn S have có một id, khi bạn muốn lưu/lưu nó. Do đó, hãy đảm bảo rằng

private String U_id; 

sẽ có giá trị, theo thời gian bạn sẽ tiếp tục tồn tại đối tượng của mình. Bạn có thể làm điều đó với chú thích @GeneratedValue hoặc bằng cách gán giá trị theo cách thủ công. Trong trường hợp bạn cần hoặc muốn chỉ định id của bạn theo cách thủ công (và đó thực sự là lỗi trên), tôi muốn chuyển các giá trị cho các trường tới hàm tạo của bạn, ít nhất là cho U_id, ví dụ:

public Role (String U_id) { ... } 

Điều này đảm bảo rằng đối tượng của bạn có id, khi bạn đã khởi tạo nó. Tôi không biết trường hợp sử dụng của bạn là gì và cách ứng dụng của bạn hoạt động đồng thời, tuy nhiên, trong một số trường hợp, điều này không được khuyến nghị. Bạn cần đảm bảo rằng id của bạn là duy nhất.

Lưu ý thêm: Hibernate sẽ vẫn yêu cầu hàm tạo mặc định, như được nêu trong hibernate documentation. Để ngăn chặn bạn (và có thể lập trình viên khác nếu bạn đang thiết kế một api) của instantiations của Role bằng cách sử dụng constructor mặc định, chỉ cần khai báo nó là private.

2

Đây là những gì tôi đã làm để giải quyết chỉ bằng 2 cách:

  1. ID cột làm như int loại

  2. nếu bạn đang sử dụng AutoGenerate ID dont assing giá trị trong setter của ID. Nếu bạn lập bản đồ một số thì đôi khi ID tự sinh không bị thừa nhận. (Tôi không biết tại sao)

  3. thử sử dụng @GeneratedValue(strategy=GenerationType.SEQUENCE) nếu có thể

0

giải quyết vấn đề này bằng cách sử dụng ID Chuỗi quy định tại cơ sở dữ liệu Oracle.

ORACLE_DB_SEQ_ID được định nghĩa là một chuỗi cho bảng. Ngoài ra, hãy xem giao diện điều khiển để xem Hibernate SQL được sử dụng để xác minh.

@Id 
@Column(name = "MY_ID", unique = true, nullable = false) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence") 
@SequenceGenerator(name = "id_Sequence", sequenceName = "ORACLE_DB_SEQ_ID") 
Long myId; 
Các vấn đề liên quan