spring data jpa问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring data jpa问题相关的知识,希望对你有一定的参考价值。

@Override
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime",
parameters = @Parameter(name = "databaseZone", value = "jvm"))
@JsonSerialize(using = DateTimeSerializer.class)
@JsonIgnore
public DateTime getCreatedDate()
System.out.println(createdDate);
return createdDate;


@Override
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime",
parameters = @Parameter(name = "databaseZone", value = "jvm"))
@JsonSerialize(using = DateTimeSerializer.class)
@JsonIgnore
这一串是什么意思

在Hibernate中使用DataTime类型,需要用到
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")

databaseZone表示数据库的区域参数
Javadoc上说:
"The type is stored using UTC timezone and presented in the JVM using the JVM's default zone. Alternatively provide the 'databaseZone' parameter in the DateTimeZone.forID(String) format to indicate the zone of the database. The 'javaZone' can be used to similarly configure the zone of the value on return from the database. NB To use the zone of the JVM supply 'jvm' "
可以看看:
http://sourceforge.net/mailarchive/forum.php?set=custom&viewmonth=&viewday=&forum_name=usertype-discuss&style=nested&max_rows=100&submit=Change+View

http://stackoverflow.com/questions/15787686/jadira-usertype-joda-time-returns-incorrect-datetime-from-database
@JsonSerialize 对日期进行格式化

@JsonIgnore 避免取JSON对象时无限递归的问题,过滤掉一些不需要的属性,说明createdDate这个属性不需要转成json,放到getter方法前生效
参考技术A @Override
这是你的IDE编辑器为你自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次这样就可以方便你阅读,也不怕会忘记.
@type 是指定DateTime 这个类吧.

@JsonSerialize(using = DateTimeSerializer.class)是确保 对象被转换为json数据是日期的转换方式
@JsonIgnore 则是为了避免取json时的无限递归的bug追问

  那这么一串parameters = @Parameter(name = "databaseZone", value = "jvm")是什么意思,“databaseZone”和“jvm”我都找不到啊

在spring-security + spring-data-jpa中从userRepository接收数据的问题[重复]

【中文标题】在spring-security + spring-data-jpa中从userRepository接收数据的问题[重复]【英文标题】:Problem with receiving data from userRepository in spring-security + spring-data-jpa [duplicate] 【发布时间】:2019-12-10 15:19:20 【问题描述】:

我真的不知道 security 和 spring data jpa 是如何工作的,但是当我尝试从数据库接收其他用户数据时,它就像一个无限循环,并且只显示我的帐户信息超过 9k 次,然后在几秒钟后它在 Web 浏览器中崩溃并出现错误 SyntaxError: JSON.parse: unterminated string literal at line 1 column 39978 of the JSON data, 我的 userRepository 是我的 UserDetailsS​​erviceImplementation 的一部分,它在 Spring Security 中用作 SQL 数据库的身份验证。没问题,我可以登录我的账号,但是我不能查询和查看其他人的数据信息。

我不知道如何绕过它。也许这是一项安全功能,无法访问其他人的凭据。

用户存储库

@Repository
public interface UserRepository extends JpaRepository<User, Long>

    public User findByUsername(String username);

    @Query("SELECT * FROM user")
    public List<User> findAll();


控制器

@RestController
@RequestMapping("/v1/api")
public class HomeApiController 

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> getUsers() 
        return userRepository.findAll();
    


用户

@Entity
@Table
public class User 

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

    @Column
    private String username;

    @Column
    @JsonIgnore
    private String password;

    @Column
    private boolean enabled;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Authority> authorities;

    public User() 
      
    then field based constructor + getters and setters

权威

@Entity
@Table
public class Authority 

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

    @Column
    private String role;

    @ManyToMany(mappedBy = "authorities")
    private Set<User> user;

    public Authority() 
    

    field constructor + getters and setters

我希望查询和检索数据库中用户表中的所有其他用户,该表也用于根据系统中的角色授权用户。

json 输出显示...

"id":1,"username":"Admin","enabled":true,"authorities":["role":"ROLE_USER","user":["id":1,"username":"Admin","enabled":true,"authorities":["role":"ROLE_USER","user":["id":1,"username":"Admin","enabled":true,"authorities":["role":"ROLE_USER","user":["id":1,"username":"Admin","enabled":true,"authorities":["role":"ROLE_USER","user":

它是无限嵌套的。 我认为当局有问题 当我清除 user_role 表时,输出效果很好

id 1 用户名“管理员” 启用 true 当局 []

怎么了?

【问题讨论】:

哦,谢谢!这完全解决了我的问题,我在 ManyToMany 注释字段上使用了 JsonManagedReference、JsonBackReference 注释。 【参考方案1】:

您必须使用@JsonIgnore 注释授权类中的用户集或注释用户类中的授权集,具体取决于您在 API 调用中的需要。

@Entity
@Table
public class User 

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

@Column
private String username;

@Column
@JsonIgnore
private String password;

@Column
private boolean enabled;

@JsonIgnore
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), 
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Authority> authorities;

public User() 
 

或者

@Entity
@Table
public class Authority 

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

@Column
private String role;

@JsonIgnore
@ManyToMany(mappedBy = "authorities")
private Set<User> user;

public Authority() 

编辑:我也建议使用 DTO 来最小化耦合并避免此类问题

【讨论】:

创建单独的 DTO 或使用 JsonIgnore 注释现有类有什么更好的主意? 我确实建议使用 DTO,因为它减少了实体和响应之间的耦合,但实际上它取决于您需要在 API 响应中返回什么,如果您需要返回所有类字段数据除了一个,那么最好只用 @JsonIgnore 注释该字段,但让我们假设您只需要返回用户名和角色,在这种情况下最好使用 DTO 对象。检查此链接oodlestechnologies.com/blogs/…

以上是关于spring data jpa问题的主要内容,如果未能解决你的问题,请参考以下文章

spring data jpa中的page对象带到jsp页面遍历问题

Spring -data-jpa ,存储库类不起作用

Maven 使用 spring-data-jpa 和 querydsl 构建问题

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

Spring Data JPA 整合Spring

Spring-data-jpa 投影生成查询不正确