1. 重写get/set 引发 JPA 的注解失效的问题
    2. 我写了基类 BasicsIntEntity AuditIntID BaseAuditFieldsLocalDateTime
      1. 在 BasicsIntEntity 中重写了 AuditIntID BaseAuditFieldsLocalDateTime 的get ```java package com.databstech.cache.jpa.entity.mysql;

    import com.databstech.cache.jpa.util.TnPageUtil; import com.databstech.utils.constant.entity.groups.AuditIntID; import com.databstech.utils.constant.entity.serializable.OvSerializable; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.domain.Page; import org.springframework.data.jpa.domain.support.AuditingEntityListener;

    import javax.persistence.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List;

    /**

    • @author tn
    • @version 1
    • @ClassName BaseDate
    • @description 公共实体INT 新建BaseDate,里面主要包含审计的公共字段,如新增人、新增时间、最后更新人、最后更新时间 *
    • @EntityListeners(AuditingEntityListener.class):声明实体监听器,用于实体修改时做处理
    • @MappedSuperclass:声明该类为实体父类,不会映射单独的表,而是把字段映射到子类表中
    • @date 2020-09-28 16:11 */ @EntityListeners(AuditingEntityListener.class) @MappedSuperclass @DynamicUpdate //动态赋值 @DynamicInsert //动态插入 public class BasicsIntEntity extends AuditIntID {
    1. @Id
    2. @GeneratedValue(strategy = GenerationType.IDENTITY)
    3. @Column(columnDefinition="int COMMENT '主键,自动生成'")
    4. @Override
    5. public Integer getId() {
    6. return super.getId();
    7. }
    8. /**
    9. * 表示该字段为创建时间字段,在这个实体被insert的时候,会自动为其赋值
    10. */
    11. @CreatedDate
    12. @Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期' ")
    13. @Override
    14. public String getCreateTime() {
    15. return super.getCreateTime();
    16. }
    17. /**
    18. * 表示该字段为创建人, @CreatedBy 在这个实体被created的时候,会自动为其赋值
    19. */
    20. @CreatedBy
    21. @Column(columnDefinition = "varchar(100) COMMENT '创建人'")
    22. @Override
    23. public String getCreateBy() {
    24. return super.getCreateBy();
    25. }
    26. /**
    27. * 表示该字段为修改时间字段,@LastModifiedDate在这个实体被update的时候,会自动为其赋值
    28. */
    29. @LastModifiedDate
    30. @Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期'")
    31. @Override
    32. public String getUpdateTime() {
    33. return super.getUpdateTime();
    34. }
    35. /**
    36. * 表示该字段为修改人,@LastModifiedBy 在这个实体被update的时候,会自动为其赋值
    37. */
    38. @LastModifiedBy
    39. @Column(columnDefinition = "varchar(100) COMMENT '更新人'")
    40. @Override
    41. public String getUpdateBy() {
    42. return super.getUpdateBy();
    43. }
    44. /**
    45. * page
    46. * @param page
    47. * @param clazz
    48. * @param <T>
    49. * @param <S>
    50. * @return
    51. */
    52. public static <T, S extends OvSerializable> TnPageUtil<List<T>> to(Page<S> page, Class<T> clazz) {
    53. if (page != null && !page.isEmpty()) {
    54. List<S> content = page.getContent();
    55. List<T> result = new ArrayList(content.size());
    56. Iterator var3 = content.iterator();
    57. while(var3.hasNext()) {
    58. OvSerializable abs = (OvSerializable)var3.next();
    59. result.add((T) abs.to(clazz));
    60. }
    61. return TnPageUtil.page(page.getNumber(),
    62. page.getSize(),
    63. page.getTotalPages(),
    64. page.getTotalElements(),
    65. result);
    66. } else {
    67. return new TnPageUtil();
    68. }
    69. }

    }

    1. 2. 在最终使用的地方 继承 BasicsIntEntity ,结果发现本类中 @Column 出现了问题,生成不了注释
    2. ```java
    3. package com.databstech.demo.standalone.jpa.bean;
    4. import com.databstech.cache.jpa.entity.mysql.BasicsIntEntity;
    5. import io.swagger.annotations.ApiModelProperty;
    6. import lombok.Getter;
    7. import lombok.Setter;
    8. import lombok.experimental.Accessors;
    9. import javax.persistence.Column;
    10. import javax.persistence.Entity;
    11. import javax.persistence.Table;
    12. /**
    13. * @author tn
    14. * @version 1
    15. * @ClassName JpaDemo
    16. * @description jpademo
    17. * @date 2020/10/2 0:47
    18. */
    19. @Entity
    20. @Table(name ="jpa_demo",schema = "test")
    21. @org.hibernate.annotations.Table(appliesTo = "jpa_demo",comment = "jpademo")
    22. @Getter
    23. @Setter
    24. @Accessors(chain = true)
    25. public class JpaDemo extends BasicsIntEntity<JpaDemo> {
    26. //@Column无法生成 sql注释
    27. @ApiModelProperty("名字")
    28. @Column(columnDefinition = " varchar(100) not null comment '名字'" )
    29. private String name;
    30. @ApiModelProperty("性别")
    31. private String sex;
    32. // 只有这样写才能生成
    33. @Column(name = "sex",columnDefinition="varchar(100) default '男' COMMENT '字典名'")
    34. public String getSex() {
    35. return sex;
    36. }
    37. }
    1. 问题原因
      1. jpa 的 访问策略 问题 导致的
        1. 我在基类中 是把注解写在 get 上的 , 所以默认整个类都使用 get 的方式为准,详情↓
      2. 当实体里的第一个jpa相关的注解出现在 字段 或者 get/set 方法上,就以第一次出现的方式为准!也就是说,一个实体里的注解既有用在field上面,又有用在 properties 上时,那么默认是一 field 为准,当出现在get/set方法上时就会失效!
    2. 共存
      1. 使用 @Access 指定实体类的访问策略 ! 下面是 该注解的源码 ```java @Target( { TYPE, METHOD, FIELD })//表示此注解可以运用在class上(那么这个时候就可以指定此实体的默认注解生效策略了),也可以用在方法上或者字段上(表示可以独立设置某一个字段或者方法的生效策略); @Retention(RUNTIME) public @interface Access { //指定是字段上面生效还是方法上面生效 AccessType value(); } public enum AccessType { FIELD, //字段 PROPERTY //属性 get/set }
    1. 1. 实例
    2. 1. @Transient 防止二次序列化
    3. 2. @Access 类上 get 上都要加
    4. ```java
    5. # 继承类
    6. package com.databstech.demo.standalone.jpa.bean;
    7. import com.databstech.cache.jpa.entity.mysql.BasicsIntEntity;
    8. import io.swagger.annotations.ApiModelProperty;
    9. import lombok.*;
    10. import lombok.experimental.Accessors;
    11. import org.hibernate.annotations.DynamicInsert;
    12. import org.hibernate.annotations.DynamicUpdate;
    13. import javax.persistence.*;
    14. /**
    15. * @author tn
    16. * @version 1
    17. * @ClassName JpaDemo
    18. * @description jpademo
    19. * @date 2020/10/2 0:47
    20. */
    21. @Entity
    22. @Table(name ="jpa_demo",schema = "test")
    23. @org.hibernate.annotations.Table(appliesTo = "jpa_demo",comment = "jpademo")
    24. @Getter
    25. @Setter
    26. @Accessors(chain = true)
    27. @DynamicUpdate //动态赋值
    28. @DynamicInsert //动态插入
    29. @Access(AccessType.FIELD)
    30. @Builder(toBuilder = true)
    31. @NoArgsConstructor
    32. @AllArgsConstructor
    33. public class JpaDemo extends BasicsIntEntity<JpaDemo> {
    34. @Column(columnDefinition = " varchar(100) not null comment '名字'" )
    35. @ApiModelProperty("名字")
    36. private String name;
    37. @Column(name = "sex",columnDefinition="varchar(100) default '男' COMMENT '字典名'")
    38. @ApiModelProperty("性别")
    39. private String sex;
    40. // @Column(columnDefinition = " varchar(100) not null comment '名字'" )
    41. // public String getName() {
    42. // return name;
    43. // }
    44. // @Column(name = "sex",columnDefinition="varchar(100) default '男' COMMENT '字典名'")
    45. // public String getSex() {
    46. // return sex;
    47. // }
    48. }
    49. # 基类
    50. package com.databstech.cache.jpa.entity.mysql;
    51. import com.databstech.cache.jpa.util.TnPageUtil;
    52. import com.databstech.utils.constant.entity.groups.AuditIntID;
    53. import com.databstech.utils.constant.entity.serializable.OvSerializable;
    54. import org.hibernate.annotations.DynamicInsert;
    55. import org.hibernate.annotations.DynamicUpdate;
    56. import org.hibernate.annotations.SelectBeforeUpdate;
    57. import org.springframework.data.annotation.CreatedBy;
    58. import org.springframework.data.annotation.CreatedDate;
    59. import org.springframework.data.annotation.LastModifiedBy;
    60. import org.springframework.data.annotation.LastModifiedDate;
    61. import org.springframework.data.domain.Page;
    62. import org.springframework.data.jpa.domain.support.AuditingEntityListener;
    63. import javax.persistence.*;
    64. import java.util.ArrayList;
    65. import java.util.Iterator;
    66. import java.util.List;
    67. /**
    68. * @author tn
    69. * @version 1
    70. * @ClassName BaseDate
    71. * @description 公共实体INT
    72. *
    73. *新建BaseDate,里面主要包含审计的公共字段,如新增人、新增时间、最后更新人、最后更新时间
    74. *
    75. * @EntityListeners(AuditingEntityListener.class):声明实体监听器,用于实体修改时做处理
    76. * @MappedSuperclass:声明该类为实体父类,不会映射单独的表,而是把字段映射到子类表中
    77. * @date 2020-09-28 16:11
    78. */
    79. @EntityListeners(AuditingEntityListener.class)
    80. @MappedSuperclass
    81. @DynamicInsert //动态插入
    82. @DynamicUpdate //动态赋值
    83. @SelectBeforeUpdate
    84. @Access(AccessType.FIELD)
    85. public class BasicsIntEntity<T> extends AuditIntID<T> {
    86. @Id
    87. @GeneratedValue(strategy = GenerationType.IDENTITY)
    88. @Column(columnDefinition="int COMMENT '主键,自动生成'")
    89. @Access(AccessType.PROPERTY)
    90. @Override
    91. public Integer getId() {
    92. return super.getId();
    93. }
    94. /**
    95. * 表示该字段为创建时间字段,在这个实体被insert的时候,会自动为其赋值
    96. */
    97. @CreatedDate
    98. @Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期' ")
    99. @Access(AccessType.PROPERTY)
    100. @Override
    101. public String getCreateTime() {
    102. return super.getCreateTime();
    103. }
    104. /**
    105. * 表示该字段为创建人, @CreatedBy 在这个实体被created的时候,会自动为其赋值
    106. */
    107. @CreatedBy
    108. @Column(columnDefinition = "varchar(100) COMMENT '创建人'")
    109. @Access(AccessType.PROPERTY)
    110. @Override
    111. public String getCreateBy() {
    112. return super.getCreateBy();
    113. }
    114. /**
    115. * 表示该字段为修改时间字段,@LastModifiedDate在这个实体被update的时候,会自动为其赋值
    116. */
    117. @LastModifiedDate
    118. @Column(columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期'")
    119. @Access(AccessType.PROPERTY)
    120. @Override
    121. public String getUpdateTime() {
    122. return super.getUpdateTime();
    123. }
    124. /**
    125. * 表示该字段为修改人,@LastModifiedBy 在这个实体被update的时候,会自动为其赋值
    126. */
    127. @LastModifiedBy
    128. @Column(columnDefinition = "varchar(100) COMMENT '更新人'")
    129. @Access(AccessType.PROPERTY)
    130. @Override
    131. public String getUpdateBy() {
    132. return super.getUpdateBy();
    133. }
    134. /**
    135. * page
    136. * @param page
    137. * @param clazz
    138. * @param <T>
    139. * @param <S>
    140. * @return
    141. */
    142. public static <T, S extends OvSerializable> TnPageUtil<List<T>> to(Page<S> page, Class<T> clazz) {
    143. if (page != null && !page.isEmpty()) {
    144. List<S> content = page.getContent();
    145. List<T> result = new ArrayList(content.size());
    146. Iterator var3 = content.iterator();
    147. while(var3.hasNext()) {
    148. OvSerializable abs = (OvSerializable)var3.next();
    149. result.add((T) abs.to(clazz));
    150. }
    151. return TnPageUtil.page(page.getNumber(),
    152. page.getSize(),
    153. page.getTotalPages(),
    154. page.getTotalElements(),
    155. result);
    156. } else {
    157. return new TnPageUtil();
    158. }
    159. }
    160. }
    161. # 基类
    162. package com.databstech.utils.constant.entity.groups;
    163. import com.databstech.utils.constant.entity.audit.BaseAuditFieldsLocalDateTime;
    164. import io.swagger.annotations.ApiModelProperty;
    165. import javax.persistence.Transient;
    166. /**
    167. * @author tn
    168. * @ClassName IntAudit
    169. * @description int类型主键加审计字段
    170. * @date 2020-09-28 15:27
    171. */
    172. public class AuditIntID<T> extends BaseAuditFieldsLocalDateTime<T> {
    173. @ApiModelProperty(value = "id")
    174. @Transient
    175. private Integer id;
    176. public Integer getId() {
    177. return id;
    178. }
    179. public void setId(Integer id) {
    180. this.id = id;
    181. }
    182. }