当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot JPA Hibernate CRUD存储库中查找表

易弘阔
2023-03-14

我尝试使用带有JPA自动配置的CRUD存储库、Hibernate和MySQL的Spring Boot。我有一些困难,使查找工作的方式,我的期望。

package com.example.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
public class User {

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

    @Column(nullable = false, updatable = false)
    private String guid;

    @ManyToOne
    @JoinColumn(name = "status", nullable = false, updatable = false)
    private Status status;

    private String description;

    public User() {
    }

    public User(final String guid) {
        this.guid = guid;
    }

    @Override
    public String toString() {
        return String.format("User[id='%d', guid='%s', description='%s']", id, guid, description);
    }

    @Override
    public boolean equals(final Object obj) {
        if (obj == null || !(obj instanceof User)) { return false; }
        final User rhs = (User) obj;
        return new EqualsBuilder().append(guid, rhs.getGuid()).build();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(guid).build();
    }

    ...getters and setters...

}
package com.example.model;

import javax.persistence.Entity;
import javax.persistence.Id;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
public class Status {

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

    private String name;

    public Status() {
    }

    public Status(final String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("Status[id='%d', name='%s', description='%s']", id, name);
    }

    @Override
    public boolean equals(final Object obj) {
        if (obj == null || !(obj instanceof Status)) { return false; }
        final Status rhs = (Status) obj;
        return new EqualsBuilder().append(name, rhs.getName()).build();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(name).build();
    }

    ...getters and setters...

}
package com.example.repository;

import org.springframework.data.repository.CrudRepository;

import com.example.model.User;

public interface UserRepository extends CrudRepository<User, Long> {

    boolean existsByGuid(String guid);

    User findByGuid(String guid);

    boolean deleteByGuid(String guid);

}

下面是SQL模式:

CREATE TABLE `status` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) DEFAULT NULL,
  `guid` varchar(255) NOT NULL,
  `status` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status_id` (`status`),
  FOREIGN KEY (`status`) REFERENCES `status` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我已经在数据库中插入了一些测试行,以检查CRUD存储库的读取功能。我可以看到查找表被正确引用了。

INSERT INTO `status` (`name`) VALUES
    ('enabled'),
    ('disabled');

INSERT INTO `user` (`guid`, `status`) 
    SELECT 'rick', `status`.`id` FROM `status` WHERE `status`.`name` = 'enabled';

INSERT INTO `user` (`guid`, `status`) 
    (SELECT 'morty', `status`.`id` FROM `status` WHERE `status`.`name` = 'disabled');

下面是JSON字符串化的输出:

{
    "users": [
        {
            "guid": "rick",
            "status": {
                "name": "enabled"
            },
            "description": null
        },
        {
            "guid": "morty",
            "status": {
                "name": "disabled"
            },
            "description": null
        }
    ],
}
{
  "guid": "jerry",
  "status": {
    "id": 2,
    "name": "disabled"
  }
}
{
  "guid": "jerry",
  "status": {
    "name": "disabled"
  }
}
{
  "guid": "jerry",
  "status": "disabled"
}
2017-11-26 22:21:57.174  WARN 3748 --- [nio-8080-exec-7] o.h.a.i.UnresolvedEntityInsertActions    : HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
    Unsaved transient entity: ([com.example.model.Status#<null>])
    Dependent entities: ([[com.example.model.User#<null>]])
    Non-nullable association(s): ([com.example.model.User.status])
2017-11-26 22:21:57.213 ERROR 3748 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.example.model.User.status -> com.example.model.Status; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.example.model.User.status -> com.example.model.Status] with root cause

org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.example.model.User.status -> com.example.model.Status
    at org.hibernate.action.internal.UnresolvedEntityInsertActions.checkNoUnresolvedActionsAfterOperation(UnresolvedEntityInsertActions.java:123) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.engine.spi.ActionQueue.checkNoUnresolvedActionsAfterOperation(ActionQueue.java:414) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionImpl.checkNoUnresolvedActionsAfterOperation(SessionImpl.java:619) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:777) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]

共有1个答案

翟缪文
2023-03-14

不幸的是,您将不得不进行查找,因为没有提供密钥。

但您可以通过使用L2缓存配置来抵消性能方面的顾虑。鉴于status实体很少更改,它们是L2缓存存储的理想候选对象。这样可以防止网络和数据库查找成本。

 类似资料:
  • 我目前集成了maven、jenkins、Nexus和git,我正在学习这些工具。 我的要求是告诉maven只从pom中提到的存储库下载依赖项。xml,而不是来自我的Nexus存储库,但它的作用恰恰相反。 我已经在my settings.xml的repository下声明了我的Nexus版本和快照存储库。我如何告诉maven从特定的存储库而不是Nexus repo下载依赖项。 下面是我的pom。xm

  • 我刚开始使用Spring Boot,正在尝试使用JPA存储库。我试图找出spring SimpleJarepository类在运行时保存数据库表的位置,以执行进一步的检索操作。我有以下服务类检索用户基于用户名。在eclipse中,我尝试在第9行检查userRepository,但我不知道从哪里可以找到Spring从DB表提取的值。我知道类将包含我试图查找的详细信息,但我想看看这些详细信息在中的位置

  • 问题内容: 我想将oracle jdbc驱动程序作为依赖项(运行时作用域)添加到我的项目中-ojdbc14。在MVNrepository站点中,放入POM的依赖项为: 当然这是行不通的,因为它不在maven使用的中央存储库中。2个问题: 如何找到包含此工件的存储库(如果有)? 我如何添加它以便Maven使用它? 问题答案: 如何找到包含此工件的存储库(如果有)? 不幸的是,由于二进制许可证,Ora

  • 问题内容: 我有一个ASP.NET MVC应用程序,我需要允许客户根据其环境配置MembershipProvider,但仍能够将该MembershipUser映射到我们数据库中的具体User模型。 将使我能够访问已登录用户的。我可以使用它来关联用户记录。我们的自定义SQL提供程序将仅返回User.Id,但AD则不同。在这种情况下,是。 如您所想,这些查找将非常频繁地发生(尽管缓存可以帮助减少数据库

  • 在我的GitHub资源库中,我有许多文件,我必须将其中一个单词更改为另一个。问题是,由于该单词的出现次数超过200次,我无法手动逐个更改它。有什么方法可以方便这一点吗?

  • 我想在中编写一个类似的查询,但它没有返回任何内容: -它不起作用。 一样完美。 以下是我的代码: