2017-08-09 15 views
0

JP30とSpringをREST APIとして学習し、CRUD操作を実行するには、this tutorialに従っていました。私は、次のコードを使用して新しい顧客を作成しようとしている場合には、顧客が作成されSpring JPA JSONとモデルのマッピングが正しく行われていない

CREATE TABLE public.customer 
(
    id integer NOT NULL, 
    firstname character varying(50), 
    lastname character varying(50) 
); 

ではなく、それぞれのフィールドにfirstnamelastnameデータを挿入する:私は、次のスキーマと私のPostgreSQLでテーブルを定義しデータをfirst_namelast_nameという名前の新しい列に挿入します。このマッピングはどのように行われますか?

コントローラ - BaseController.java:

// all imports 
@RestController 
public class BaseController { 
    @Autowired 
    CustomerRepository repository; 
    @RequestMapping(value = "/postcustomer", method = RequestMethod.POST) 
    public void postCustomer(@RequestBody Response request) { 
     request.getData().forEach((data) -> { 
      repository.save(data.getCustomer()); 
     }); 
    } 
} 

JSONMapping - Response.java:

// all imports 
public class Response implements Serializable { 
    private String status; 
    private List<Data> data; 
    public Response(String status, List<Data> data) { 
     this.status = status; 
     this.data = data; 
    } 
    public Response() { 
    } 
    //all getter setters below 
} 

JSONマッピング - Data.java:

// all imports 
public class Data implements Serializable{ 
    @JsonProperty("Customer") 
    private Customer customer; 
    public Data() { 
    } 
    public Data(Customer customer) { 
     this.customer = customer; 
    } 
    // all getter setters 
} 

モデル - Customer.java:

// all imports 
@Entity 
@Table(name = "customer") 
public class Customer implements Serializable { 
    private static final long serialVersionUID = -3009157732242241606L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    @JsonProperty("firstname") 
    @Column(name = "firstname") 
    private String firstName; 
    @JsonProperty("lastname") 
    @Column(name = "lastname") 
    private String lastName; 
    protected Customer() { 
    } 
    public Customer(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
    // all getter setters 
} 

リポジトリ - CustomerRepository.java:

// all imports 
public interface CustomerRepository extends CrudRepository<Customer, Long> { 

} 

JSONが送信されて:春JPAはそのを使用しているため

{ 
    "status": "Done", 
    "data": [ { 
     "Customer": { 
      "firstname" : "test", 
      "lastname" : "123" 
     } 
    }] 
} 
+0

ファイルapplication.propertiesに以下の行を置きます。 –

+0

あなたのコードではfirst_name、last_nameのようなものはありませんので、テーブルから既存の列を削除し、ORM –

答えて

2

はこれが起こりました独自のデフォルト命名規則 はちょうどあなたが使用している列の注釈がjavax.persistence.Columnでない場合を除いては、起こり得ない

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
+0

を使用して再度テーブルを作成しようとします。つまり、SpringはJPA仕様を継承します。 JPA仕様では、標準のカラム名を定義する手間がかかり、Springは速やかに移植性を捨ててしまいます。あなたの危険でそれを使用してください... –

+0

作品!また、このプロパティをapplication.propertiesに追加して、ddlを自動的に生成しました。 'spring.jpa.generate-ddl = true' – JackSlayer94

関連する問題