Wednesday, December 9, 2015

JCart: Create JPA Entities

We are going to create the JPA Entities for the database tables we designed.

@Entity
@Table(name="users")
public class User
{
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 @Column(nullable=false)
 @NotEmpty()
 private String name;
 @Column(nullable=false, unique=true)
 @NotEmpty
 @Email(message="{errors.invalid_email}")
 private String email;
 @Column(nullable=false)
 @NotEmpty
 @Size(min=4)
 private String password;
 private String passwordResetToken;
 
 @ManyToMany(cascade=CascadeType.MERGE)
 @JoinTable(
       name="user_role",
       joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="ID")},
       inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")})
 private List<Role> roles;
 //setters & getters
}
@Entity
@Table(name="roles")
public class Role
{
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 @Column(nullable=false, unique=true)
 @NotEmpty
 private String name;
 @Column(length=1024)
 private String description;
 
 @ManyToMany(mappedBy="roles")
 private List<User> users;

 @ManyToMany
   @JoinTable(
       name="role_permission",
       joinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")},
       inverseJoinColumns={@JoinColumn(name="PERM_ID", referencedColumnName="ID")})
   private List<Permission> permissions;

  //setters & getters 
}
@Entity
@Table(name="permissions")
public class Permission
{
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 @Column(nullable=false, unique=true)
 private String name;
 @Column(length=1024)
 private String description;
 @ManyToMany(mappedBy="permissions")
 private List<Role> roles;
 
 //setters & getters
}
@Entity
@Table(name="addresses")
public class Address implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer id;
 private String addressLine1;
 private String addressLine2;
 private String city;
 private String state;
 private String zipCode;
 private String country;
 
 //setters & getters
}
@Entity
@Table(name="categories")
public class Category
{
 @Id @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 @Column(nullable=false, unique=true)
 @NotEmpty
 private String name;
 @Column(length=1024)
 private String description;
 @Column(name="disp_order")
 private Integer displayOrder;
 private boolean disabled;
 @OneToMany(mappedBy="category")
 private Set<Product> products;

 //setters & getters 
}
@Entity
@Table(name="products")
public class Product implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Column(name="id")
 private Integer id;
 @Column(nullable=false, unique=true)
 private String sku;
 @Column(nullable=false)
 private String name;
 private String description;
 @Column(nullable=false)
 private BigDecimal price = new BigDecimal("0.0");
 private String imageUrl;
 private boolean disabled;
 @Temporal(TemporalType.TIMESTAMP)
 @Column(name="created_on")
 private Date createdOn = new Date();
 
 @ManyToOne
 @JoinColumn(name="cat_id")
 private Category category;
 
 //setters & getters
}
@Entity
@Table(name="customers")
public class Customer implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer id;
 @Column(name="firstname", nullable=false)
 @NotEmpty
 private String firstName;
 @Column(name="lastname")
 private String lastName;
 @NotEmpty
 @Email
 @Column(name="email", nullable=false, unique=true)
 private String email;
 @NotEmpty
 @Column(name="password", nullable=false)
 private String password;
 private String phone;

 //setters & getters
}
@Entity
@Table(name="orders")
public class Order implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer id;
 @Column(nullable=false, unique=true)
 private String orderNumber;
 @OneToMany(cascade=CascadeType.ALL, mappedBy="order")
 private Set<OrderItem> items;
 @ManyToOne(cascade=CascadeType.MERGE)
 @JoinColumn(name="cust_id")
 private Customer customer;
 @OneToOne(cascade=CascadeType.PERSIST)
 @JoinColumn(name="delivery_addr_id")
 private Address deliveryAddress;
 @OneToOne(cascade=CascadeType.PERSIST)
 @JoinColumn(name="billing_addr_id")
 private Address billingAddress;
 @OneToOne(cascade=CascadeType.PERSIST)
 @JoinColumn(name="payment_id")
 private Payment payment;
 @Enumerated(EnumType.STRING)
 private OrderStatus status;
 @Temporal(TemporalType.TIMESTAMP)
 @Column(name="created_on")
 private Date createdOn;
 
 //setters & getters
}
@Entity
@Table(name="order_items")
public class OrderItem implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer id;
 @ManyToOne
 @JoinColumn(name="product_id")
 private Product product;
 private BigDecimal price;
 private int quantity;
 @ManyToOne
 @JoinColumn(name="order_id")
 private Order order;
 
 //setters & getters
}
public enum OrderStatus
{
 NEW, IN_PROCESS, COMPLETED, FAILED
}
@Entity
@Table(name="payments")
public class Payment implements Serializable
{
 private static final long serialVersionUID = 1L;
 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Integer id;
 @Column(name="cc_number")
 private String ccNumber;
 private String cvv;
 private BigDecimal amount;
 
 //setters & getters
}
As we have configured spring.jpa.hibernate.ddl-auto=update when we run the JCartCoreApplicationTest again all the tables will be automatically created/updated.

SpringBoot provides a nice and easy way to initialize the database with some seed data using data.sql file. We can use jcart-core/src/test/resources/data.sql script https://github.com/sivaprasadreddy/jcart/blob/master/jcart-core/src/test/resources/data.sql to populate some sample data.

No comments:

Post a Comment