I'm studying spring boot PostgreSQL and I have a question.
I have a class which is an entity, it's called order and creates a table in PostgreSQL, it has three attributes: private long orderid, private String productname and private Seller seller;
The last one, Seller is another class/entity, it has the attributes sellername and productcode, how can I pass this class Seller to my class Order? I want to do that in order to create a table in PostgreSQL.
@Entity
@Table(name ="order")
public class Order implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderid;
@Column(name="productname")
private String product name;
**Here is where I want to put the class Seller**
}
@Entity
@Table(name="seller")
public class Seller implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="productcode")
private String productcode;
@Column(name="sellername")
private String sellername;
CodePudding user response:
Whenever there is need for nested structure in Postgresql , we create type.
Step 1: Create type Seller:
postgres=# create type seller as (sellername varchar(20),productcode int);
CREATE TYPE
Step 2: Create table Order ( table name ORDER is under double-quote because order is a keyword in postgresql):
postgres=# create table "order"(orderid bigint,productname varchar(20),seller seller);
CREATE TABLE
postgres=# \d "order"
Table "public.order"
Column | Type | Collation | Nullable | Default
------------- ----------------------- ----------- ---------- ---------
orderid | bigint | | |
productname | character varying(20) | | |
seller | seller | |
Step 3: Insert and verify values:
postgres=# insert into "order" values(1,'laptop',('roger',10));
INSERT 0 1
postgres=# select * from "order";
orderid | productname | seller
--------- ------------- ------------
1 | laptop | (roger,10)
(1 row)
Step 4: Querying composite type:
postgres=# select * from "order";
orderid | productname | seller
--------- ------------- ------------
1 | laptop | (roger,10)
(1 row)
postgres=# select seller from "order" where orderid=1;
seller
------------
(roger,10)
(1 row)
postgres=# select to_json(seller) from "order" where orderid=1;
to_json
-----------------------------------------
{"sellername":"roger","productcode":10}
(1 row)
postgres=# select to_json(seller)->>'sellername' from "order" where orderid=1;
?column?
----------
roger
(1 row)
postgres=# select to_json(seller)->>'productcode' from "order" where orderid=1;
?column?
----------
10
(1 row)
CodePudding user response:
I think you need to have relationship @OneToMany for saller -> order and @ManyToOne order -> saler. In this case will be like this.
@Entity
@Table(name ="order")
public class Order implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderid;
@Column(name="productname")
private String product name;
@ManyToOne
@JoinColumn(name = "seller_id)
private Seller seller;
}
@Entity
@Table(name="seller")
public class Seller implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="productcode")
private String productcode;
@Column(name="sellername")
private String sellername;
@OneToMany(mappedBy = "seller")
private List<Order> orders;
}
In this case you will have the right relationship, so One seller can have many orders.
