2012-12-16 22 views
9

Tôi có một thực thể đơn giản. Tôi đang sử dụng phiên bản Spring-data-jpa 1.2.0.RELEASE và eclipselink 2.4.1.Tại sao ID không được đặt trong thực thể được trả về từ spring-data-jpa, hãy lưu

@Entity 
@Table(name="platform") 
public class Platform { 

    @Id 
    @Column(name="id", nullable=false, updatable=false, insertable=true) 
    private Long id; 
    // etc. 
} 

Tôi muốn lưu. kho của tôi trông giống như

public interface PlatformRepository extends JpaRepository<Platform, Long> { 

    Platform findByName(String name); 
} 

tôi điều khiển là rất đơn giản với phương pháp này

@RequestMapping(method=RequestMethod.POST, produces="application/json") 
public Platform post(Platform platform) { 
    Platform result = platformDao.saveAndFlush(platform); 
    return result; 
} 

Và phản ứng từ phương pháp đó là

{"platform":{"id":null,"name":"Test1"}} 

Select * from nền tảng cho thấy Test1 có một ID của 6. Bảng được định nghĩa là:

create table platform(
id int not null auto_increment primary key, 
name varchar(128) not null); 

Tôi hy vọng ID sẽ được đặt sau khi lưu, nhưng không phải. Họ không mong đợi tôi tra cứu ngay lập tức sau khi viết thực thể, đúng không?

+0

Chỉ cần đoán: cố gắng thay đổi 'id' từ' Long' thành 'int' và' insertable = true' thành 'false'. Ngoài ra, [* this *] (http://stackoverflow.com/questions/12122489/jparepository-transaction-and-repository-saveandflush) có thể có liên quan. – alfasin

Trả lời

13

Bạn chưa chỉ định ID được tạo tự động bởi cơ sở dữ liệu trong ánh xạ của bạn. Thêm

@GeneratedValue(strategy = GenerationType.IDENTITY) 

vào trường ID của bạn. Không có nó, JPA không biết rằng nó phải thực hiện một câu lệnh chọn sau khi chèn để lấy ID được tạo ra từ cơ sở dữ liệu.

+0

Duh ... Tôi biết điều đó. Tôi sẽ chấp nhận điều này ngay sau khi tôi xác nhận nó. – digitaljoel

Các vấn đề liên quan