Skip to content
On this page

JPA Entities

java

Generate JPA @Entity classes with annotations from SQL schema

Example Output ​

Generated from the pet-store sample schema:

Adoption.java ​

java
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@Table(name = "adoptions")
public class Adoption {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    @JoinColumn(name = "pet_id")
    @Column(nullable = false)
    private int petId;

    @ManyToOne
    @JoinColumn(name = "owner_id")
    @Column(nullable = false)
    private int ownerId;

    @Column(nullable = false)
    private LocalDateTime adoptedAt;

    @Column(nullable = false)
    private BigDecimal adoptionFee;

}

AdoptionsAuditLog.java ​

java
import jakarta.persistence.*;
import java.time.OffsetDateTime;

@Entity
@Table(name = "adoptions_audit_log")
public class AdoptionsAuditLog {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false)
    private String tableName;

    @Column(nullable = false)
    private String operation;

    private String oldData;

    private String newData;

    @Column(nullable = false)
    private OffsetDateTime changedAt;

}

Category.java ​

java
import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;

@Entity
@Table(name = "categories")
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    @NotEmpty
    private String name;

    private String description;

}

LegacyInventory.java ​

java
import jakarta.persistence.*;

@Entity
@Table(name = "legacy_inventory")
public class LegacyInventory {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String itemName;

    private String oldSku;

    private Integer quantity;

}

Location.java ​

java
import jakarta.persistence.*;

@Entity
@Table(name = "locations")
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String address;

    @Column(nullable = false)
    private String city;

    private String zip;

}

MedicalRecord.java ​

java
import jakarta.persistence.*;
import java.time.LocalDate;

@Entity
@Table(name = "medical_records")
public class MedicalRecord {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    @JoinColumn(name = "pet_id")
    @Column(nullable = false)
    private int petId;

    @Column(nullable = false)
    private LocalDate visitDate;

    @Column(nullable = false)
    private String diagnosis;

    private String treatment;

    private String vetName;

}

Owner.java ​

java
import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;

@Entity
@Table(name = "owners")
public class Owner {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    @NotEmpty
    private String name;

    @Column(nullable = false)
    @Pattern(regexp = "^[^@]+@[^@]+\\.[^@]+$")
    private String email;

    @Size(min = 7, max = 20)
    private String phone;

    private LocalDateTime createdAt;

}

Pet.java ​

java
import jakarta.persistence.*;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@Table(name = "pets")
public class Pet {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    @JoinColumn(name = "category_id")
    private Integer categoryId;

    @Column(nullable = false)
    @NotEmpty
    private String name;

    @Column(nullable = false)
    @Pattern(regexp = "^[A-Z]{3}-[0-9]{4}$")
    private String sku;

    @Column(nullable = false)
    @Min(0)
    @Max(99999)
    private BigDecimal price;

    private String internalNotes;

    @Column(nullable = false)
    private String status;

    private LocalDateTime createdAt;

}

Review.java ​

java
import jakarta.persistence.*;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import java.time.LocalDateTime;

@Entity
@Table(name = "reviews")
public class Review {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    private int petId;

    @Column(nullable = false)
    private int ownerId;

    @Column(nullable = false)
    @Min(1)
    @Max(5)
    private int rating;

    private String body;

    @ManyToOne
    @JoinColumn(name = "location_id")
    private Integer locationId;

    private LocalDateTime createdAt;

}

StaffAuditLog.java ​

java
import jakarta.persistence.*;
import java.time.OffsetDateTime;

@Entity
@Table(name = "staff_audit_log")
public class StaffAuditLog {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false)
    private String tableName;

    @Column(nullable = false)
    private String operation;

    private String oldData;

    private String newData;

    @Column(nullable = false)
    private OffsetDateTime changedAt;

}

Usage ​

Add to your sqldoc.config.ts:

typescript
export default {
  dialect: 'postgres',
  schema: ['./schema.sql'],
  codegen: [
    {
      template: 'jpa',
      output: './generated/Models.java',
    },
  ],
}

Then run:

bash
sqldoc codegen