2016-11-19 36 views
2

最新のスプリングブートdata-jpaHibernateを使用しています。使用されるデータベースはOracle 11Gです。私は数日間ソリューションを検索してきましたが、何も機能しませんでした。 私はに、データベースに新規に(正常に)挿入されたエンティティのIDを取得するのに苦労します。私はシーケンスとトリガーを使用します。例えばなぜ、saveandflushの後にエンティティ内のidがnullですが、データベースでnullではないのですか?

エンティティ:

@Entity 
    public class Address implements Serializable { 
    @Id 
    @Column(name = "ID", nullable = false, precision = 0) 
    @SequenceGenerator(name = "SEQ_ID_GEN", sequenceName = "GI2S1.SEQ_ID", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID_GEN") 
    private long id; 
    private String addressLine; 
    private String addressLine2; 
    private String city; 
    private String postalCode; 

    @Id 
    public long getId() { 
     return id; 
    } 
    Getters & setters omitted... 

トリガー:

CREATE OR REPLACE TRIGGER SEQ_ADDRESS_TRIG 
    BEFORE INSERT ON ADDRESS 
    FOR EACH ROW 
BEGIN 
    SELECT SEQ_ID.nextval 
    INTO :new.id 
    FROM dual; 
END; 
/

配列:

CREATE SEQUENCE SEQ_ID START WITH 1 INCREMENT BY 1 MINVALUE 1; 

クエリがコントローラで実行されます。例えば

@Controller 
@RequestMapping("/address") 
public class AddressController { 

@Autowired 
private AddressRepository addressRepository; 

@Transactional 
public Address saveAddress(Address address) { 
    try { 
     return addressRepository.saveAndFlush(address); 
    } catch (Exception ex) { 
     System.out.println(ex); 
    } 
    return null; 
} 

@PostMapping("/create") 
public String create(@ModelAttribute Address address) { 
    Address saved = saveAddress(address); 
    long id = saved.getId(); 

    System.out.println(saved); 

    return (id > 0) ? 
      "redirect:/address/find?id=" + id 
      : 
      "redirect:/address/list"; 
} 

のfindAll

{ "ID" 後の結果:81、 "addressLine": "AA"、 "住所2": "A"、 "街": "A"、」 postalCode ":" a "}

ここでは、System.out.println(saved)の後のオブジェクトです。

アドレス{ID = 0、addressLineは= 'AA'、住所2は= 'A'、都市= ''、 postalCodeの= 'A'}

リポジトリ:

@Transactional 
public interface AddressRepository extends JpaRepository<Address, Long> { 
    List<Address> findByCity(String city); 
} 

セッションの問題があると思われますが、データはまだコミットされていません。私は正しい?それを解決するには?ありがとう!

答えて

0

問題が解決しました。

アドレスエンティティにgetId getIdの前に@Idアノテーションがありました。

@Id 
public long getId() { 
    return id; 
} 

後:

は、直前に注釈

を削除

public long getId() { 
    return id; 
} 
+1

なぜこれが問題を解決しましたか? –

関連する問題