[Java] JPA mapping 常用 attribute

因為project 會從Java 轉移到.net 中, 趁此機會順便對Java JPA 有關的mapping 摘錄, 以便以後查看.

@Entity
@Table(name = "OT_WAITING_QUEUE")
@JsonInclude(Include.NON_ABSENT)
public class ClassA {
  // Primary Key mapping settings.
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long classAId;
  
  // Column mapping if different name.
  @Column(name = "book_time")
  private Date bookingStartAt;

  // Column mapping to assoicated table. (one to one)
  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "classB_id", updatable = false)
  private ClassB classB;

  @OneToMany(cascade=CascadeType.ALL, mappedBy="classA")
  @Where(clause="isActive = 1")
  private Set<ClassC> classCs;

  // Getter and setters.

  // Getter attribute to prevent recursive serialization.
  @JsonManagedReference
  public Set<ClassC> getClassCs() {
    return classCs;
  }
  public void setClassCs(Set<PatientConsentForm> classCs) {
    this.classCs= classCs;
  }	
}

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="patientConsentFormId", scope=PatientConsentForm.class)
public class ClassC extends AccountableEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long classCId;

  // Many-to-one mpaaing settings.
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "ClassAId",updatable = false)
  private ClassA classA;
  
  // Getter attribute to prevent recursive serialization.
  @JsonBackReference
  public ClassA getClassA() {
    return classA;
  }
  public void setClassA(ClassA classA) {
    this.classA = classA;
  }
}

Abstract class 的設定.

// Decide it is abstract class and mapping implement in child class.
@MappedSuperclass
public abstract class AccountableEntity extends SoftDeleteEntity {
  private Date CreatedAt;
  private String CreatedBy;
  private Date LastModifiedAt;
  private String LastModifiedBy;
  
  public Date getCreatedAt() {
    return CreatedAt;
  }
  public void setCreatedAt(Date createdAt) {
    CreatedAt = createdAt;
  }
  public String getCreatedBy() {
    return CreatedBy;
  }
  public void setCreatedBy(String createdBy) {
    CreatedBy = createdBy;
  }
  public Date getLastModifiedAt() {
    return LastModifiedAt;
  }
  public void setLastModifiedAt(Date lastModifiedAt) {
    LastModifiedAt = lastModifiedAt;
  }
  public String getLastModifiedBy() {
    return LastModifiedBy;
  }
  public void setLastModifiedBy(String lastModifiedBy) {
    LastModifiedBy = lastModifiedBy;
  }	

  public void updateAccountableInfo(String modifiedBy) {
    Date currentDate=new Date();
    if(this.getCreatedAt()==null) {
      this.setCreatedAt(currentDate);
      this.setCreatedBy(modifiedBy);
    }
    this.setLastModifiedAt(currentDate);
    this.setLastModifiedBy(modifiedBy);
  }
}

Repository

@Repository
public interface TestRepository extends CrudRepository<Test, Long> {
  @Query(value="SELECT OTWQ, p, r, s1, dohp "
      + "FROM Test OTWQ "
      + "LEFT JOIN FETCH OTWQ.patient p "
      + "JOIN FETCH OTWQ.room r "
      + "JOIN FETCH OTWQ.surgeon1 s1 "
      + "JOIN FETCH OTWQ.departmentOfHealthProcedure dohp "
      + "WHERE OTWQ.room.id in :theatreIds "
      + "AND OTWQ.surgeon1.id in :doctorIds "
      + "ORDER BY OTWQ.bookingStartAt ")
  List<OperationTheatreWaitingQueue> findByCriteria(
      @Param("theatreIds") List<Long> theatreIds,
      @Param("doctorIds") List<Long> doctorIds);
}

在 Controller 中透過DI 叫用repository.

@RestController
@RequestMapping(path = "/doctor")
@CrossOrigin(origins = "*")
public class TestController {
  private static final Logger logger = LoggerFactory.getLogger(TestController .class);
  @Autowired
  private DoctorRepository doctorRepository;
  
  @GetMapping(path = "/findAll")
  public List<Doctor> findAll(@RequestParam boolean isActive) {
    logger.debug("findAll() started. isActive="+isActive);
    List<Test> result=new ArrayList<Test>();
    result=testRepository.findAllTests(isActive);
    logger.debug("findAll() executed. no. of record(s) found="+result.size());
    return result;
  }
  @PostMapping(path = "/findOperationThreaterWaitingQueuesByCriteria")
  public @ResponseBody List<OperationTheatreWaitingQueue> findOperationThreaterWaitingQueuesByCriteria(
      @RequestBody WaitingQueueSearchCriteria searchCriteria)	{
  }
}

application.properties

-- Hibernate connection settings.
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:sqlserver://Test:1433;databaseName=HMS
spring.datasource.username=AppUser
spring.datasource.password=

-- JPA debug settings.
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

-- Hibernate class mapping conversion.
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

-- For JBoss deployment settings.
spring.jmx.enabled=false

spring.jackson.serialization.fail-on-empty-beans=false

-- Set spring boot log level.
logging.level.org.springframework.web=DEBUG

 

About C.H. Ling 260 Articles
a .net / Java developer from Hong Kong and currently located in United Kingdom. Thanks for Google because it solve many technical problems so I build this blog as return. Besides coding and trying advance technology, hiking and traveling is other favorite to me, so I will write down something what I see and what I feel during it. Happy reading!!!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


This site uses Akismet to reduce spam. Learn how your comment data is processed.