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

如何在Spring Data Rest中发布和放置两个实体之间的关系@onetomany/@manytoone?

林烨华
2023-03-14
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Entity
@Table
public class Author {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)", length = 16)
    private UUID id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.LAZY, targetEntity = Book.class, mappedBy = "author")
    private List<Book> books;

    // getters and setters

}
@Entity
@Table
public class Book {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)", length = 16)
    private UUID id;

    @Column
    private String title;

    @Column
    private String language;

    @ManyToOne(fetch = FetchType.EAGER, targetEntity = Author.class)
    private Author author;

    // getters and setters

}
@RestResource(path = "authors", rel = "authors")
public interface AuthorRepository extends JpaRepository<Author, UUID> {
}
@RestResource(path = "books", rel = "books")
public interface BookRepository extends JpaRepository<Book, UUID> {
}
{
  "_links" : {
    "authors" : {
      "href" : "http://localhost:8080/authors{?page,size,sort}",
      "templated" : true
    },
    "books" : {
      "href" : "http://localhost:8080/books{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile"
    }
  }
}

url http://localhost:8080/authors返回此页面:

{
  "_embedded" : {
    "authors" : [ ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/authors"
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/authors"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

url http://localhost:8080/books返回此页面:

{
  "_embedded" : {
    "books" : [ ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/books"
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/books"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

我试图从Book类开始制作一些HTTP POST。

HTTP POST
url: http://localhost:8080/books
header: Content-Type:application/json
payload: { "title": "Book Title" }

Status: 201: Created
Location: http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1
{
  "title" : "Book Title",
  "language" : null,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1"
    },
    "book" : {
      "href" : "http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1"
    },
    "author" : {
      "href" : "http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1/author"
    }
  }
}
HTTP POST
url: http://localhost:8080/authors
header: Content-Type:application/json
payload: { "name": "Author Name" }

Status: 201: Created
Location: http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11
{
  "name" : "Author Name",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11"
    },
    "author" : {
      "href" : "http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11"
    },
    "books" : {
      "href" : "http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11/books"
    }
  }
}
HTTP PUT
url: http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11
header: Content-Type:application/json
payload: { "books": ["http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1"] }

Status: 204: No Content
Location: http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11

我有一个响应代码HTTP 204(没有内容)。如果我转到URLhttp://localhost:8080/authors/634D3BD8-ABE6-472B-97CD-04A455BDFB11/Books,我希望得到的结果是这本书,但我得到的结果是:

{
  "_embedded" : {
    "books" : [ ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/authors/634d3bd8-abe6-472b-97cd-04a455bdfb11/books"
    }
  }
}

“Books”属性仍然是空的。为什么?

此外,此URL返回一个空页面:http://localhost:8080/books/61311c9b-b33a-463c-9e6e-8e5efc0a7ad1/author

谢谢

共有1个答案

顾俊哲
2023-03-14

为了使这种情况发生逆转,您的@onetomany(fetch=fetchtype.lazy,targetEntity=book.class,mappedBy=“author”)中应该有cascade选项,以便实际持久化book实体中的更改。

试试这个:

@onetomany(fetch=FetchType.lazy,targetEntity=Book.class,mappedBy=“author”,cascade=CascadeType.all)

 类似资料:
  • 我试图在JPA中规划这种关系,但似乎在这里迷失了方向。这是我的ER型号说明。我有一个,其中一个客户有一个,这个包含股票。这就是我的想法。每个都有一个,即(关系)1:1,仓库可以包含更多的股份(库存)。仓库-- 我有以下代码。 Customer.java Depot.java 使用上面的代码,我甚至可以创建并持久化客户。我是不是做错了地图? 如果我试图将数据持久化到上面的数据库中,我会收到以下错误消

  • 我有两个词A,B。在这个词中A是父词,有下面的表结构。 A1-->Acolumn 甚至我也尝试过使用普通连接。PLS让我知道我错过了什么。 我使用@query来指定query。选择a From TableA a LEFT OUTER JOIN FETCH a.tableAcollection p,其中a.tableacolum=?1和p.tablebcolumn<>p.tablebcolumn。

  • 我的Spring Boot应用程序中有两个实体: 使用者JAVA 和 Role.java 我的MySql数据库 我已经排除了这个问题的getter和setter方法。 我想实现两个实体之间的多对多关系。每个用户都应该能够为自己分配多个角色 我已经在我的数据库中为这两个表创建了一个映射表。它有几排 用户id 我还创建了一个新的实体UserRole。java,如下所示: 现在我的问题是:这种构造正确吗

  • 首先,我的英语很差,如果我的写作让人困惑,请原谅。 我试图在实例之间创建以下关系:如果,和,那么。在我的例子中,我想指定如果一个“管理”一名员工,并且与有相同的工作,那么他也管理同一名员工。 我尝试使用链属性来实现这一点,但当我激活它时,推理器(事实1.6.5)不起作用(日志显示使用了一个非简单属性)。我认为问题在于属性“manages”是不对称的和不可伸缩的,而属性“sameJob”是可传递的和

  • 我在这里粘贴类: 链类: 相机项目类别:

  • 如何为这种多对多关系分配默认值?制作两个关联表->一个用于收件箱-关系,另一个用于发件箱-关系会更好吗?我该如何做到这一点?这个问题的其他解决方案? 任何帮助都非常感谢--非常感谢!