最新のスプリングブートとdata-jpaとHibernateを使用しています。使用されるデータベースは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);
}
セッションの問題があると思われますが、データはまだコミットされていません。私は正しい?それを解決するには?ありがとう!
なぜこれが問題を解決しましたか? –