小编Per*_*osh的帖子

Spring JPA多对多:删除实体,删除连接表中的条目,但不删除另一方

我有这个用例:

  • 我有用户.
  • 我有团体.
  • 用户和组之间存在N:N关系.
  • 我无法删除用户.
  • 如果删除组,则不应删除该组中的用户.

用户方:

@ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
                    name = "USERS_GROUPS",
                    joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID") ,
                    inverseJoinColumns = @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID") )
    private List<GroupJPA> groups;
Run Code Online (Sandbox Code Playgroud)

小组方:

@ManyToMany(mappedBy = "groups", cascade = CascadeType.ALL)
private List<UserJPA> returnsList;
Run Code Online (Sandbox Code Playgroud)

如果我从用户的组列表中删除了一个组,该组将从用户列表中删除,它将从连接表中删除,并且不会从组表中删除.这是欲望行为.

但是,如果我删除整个组,会发生什么,连接表中的所有引用都被删除,但也删除了用户!这不可能发生.

我正在使用4.3.5.Final和Spring 4.3.0.RELEASE.

java spring hibernate jpa

6
推荐指数
1
解决办法
2562
查看次数

AWS:专用主机 VS 专用实例,为什么第一个比后一个贵?

我正在 AWS 为我的 Associate Architect 考试学习,我找不到这个问题的解释。为什么专用主机比专用实例贵?我了解两者之间的主要区别,只是在我的大脑中它没有意义。

这是我的观点:如果您要求专用主机,则您可以控制整个硬件。CPU、RAM、套接字等。您可以使用自己的许可证 (BYOL)。但是,如果您要求专用实例,它的硬件仍然只适合您。您的 AWS 账户仍然是唯一一个使用该硬件的账户。您对它的控制较少,但即使您只是为了您的目的而锁定单个硬件。

那么,为什么专用主机比专用实例更昂贵,毕竟,在任何一种情况下,您都“拥有”硬件?同样,在任何一种情况下,AWS 都无法将该硬件用于其他用途。

host multi-tenant amazon-web-services

6
推荐指数
3
解决办法
1525
查看次数

Lambda 的 AWS 自定义域名

我正在使用 AWS Lambdas 并使用无服务器部署它们。每次我部署任何函数时,我都会收到这种 URL 来访问服务:

https://mh6r122dq1.execute-api.us-east-1.amazonaws.com/ {stage}/{function}

其中 'stage' 是 dev 或 qa,'function' 是我的 lambda 函数的名称。

我正在尝试使用更友好的 URL 访问我的 lambda。我遵循了 AWS 文档中的本教程:

http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

我不能让它工作。我已经创建了证书,我的公司做到了。所以对我来说,这只需选择您的域名称并将其附加到您的 Lambda API 网关即可。

这些是我正在做的步骤:

1) 我在这里创建了一个自定义域名https://console.aws.amazon.com/apigateway/home?region=us-east-1#/custom-domain-names。该页面自动为我提供证书。我正在使用一些虚构的名称,例如 my.service.com。我还尝试使用我公司的完全限定域名,该域名托管在我们的 AWS 账户中。两者都没有奏效。

2) 然后从同一页面中选择基本路径、目的地(这是我的 lambda)和舞台。保存后,该页面为我提供了一个名为“分发域名”的值,它看起来像 abc123def456.cloudfront.com。

3) 然后我转到 Amazon 53 并创建一个新的托管区域。同样,如果我需要完全编造的东西或真正的域,我在这里很确定。然后我为一个ip地址创建一个新的A记录,我标记为Alias-true,然后我把上面的值放在“分发域名”

就是这样。这些是我正在做的步骤。然后,当我尝试点击我的 Lambda 时,我按照上面“具有默认和自定义域名的 API 的根 URL”部分中的页面中的说明进行操作。

我遵循了这个过程几次,我真的很想知道那个页面是否正常。当我使用自定义域名访问我的 lambdas 时,我收到 404 或“无法解析此主机”。

有没有人从 AWS 的那个页面遵循这个过程并取得了良好的结果?

更新 7 月 13 日星期四 12:23

以下是我设置的一些图片:

我的自定义域名

在此处输入图片说明

在此处输入图片说明

对于 qa-lambda.lqwebservices.com 或 rateloader.qa.lqwebservices.com,我收到“无法解析主机”

amazon-web-services amazon-route53 aws-lambda

5
推荐指数
1
解决办法
3014
查看次数

AWS ECS如何从一个容器调用服务到另一个容器

我有一个ECS群集,该群集具有一个包含2个EC2实例的Auto Scaling组。我也有3个服务,每个服务都有自己的任务定义。每个EC2实例为每个服务运行一个docker容器。因此,每个EC2实例中都有3个docker容器。

每个泊坞窗容器仅运行一个spring boot应用程序。由于我有3个服务,所以我有3个Spring Boot应用程序。同样,一个容器仅运行这3个Spring Boot应用程序之一。每个应用程序都在/ service1或/ service1 / resource1之类的URL下公开一个休息的API,其中包含POST,GET等服务。这里重要的一点是我正在容器的主机中使用动态端口映射。

我在端口443上有一个外部(面向Internet)ALB,它具有3个目标组。根据URL,请求将转到3个应用(或容器)之一。

我的问题有时是应用A需要向应用B发出http请求。我的EC2实例位于私有子网中,而ALB则位于公共子网中。因此,如果我使用自己的ALB将HTTP请求从一个容器内部发送到另一个容器,那么将发生该请求将通过NAT,并且由于NAT的公共IP不属于ALB的安全组,因此它将无法在端口443上进行连接。我有2种方法可以使这项工作:

  • 在ALB的安全组白名单0.0.0.0/0中。我不想这样做,因为整个世界都可以访问。

  • 在ALB的安全组中,将NAT的公共IP列入白名单。我不确定这种方法。值得推荐吗?

我尝试实现的第三个选项是拥有第三个负载均衡器,即内部负载均衡器。但是我在这里迷路了,根据AWS文档,您只能为您的服务分配1个负载均衡器。而且由于我们使用的是动态端口映射,所以我看不到手动创建ALB并使用动态自动分配端口的方法。

你们如何在容器之间建立这种连接,而一个容器使用其他容器提供的服务呢?

作为最后的评论,我对所有人使用云形成。没有从控制台手动设置。

谢谢,

amazon-ec2 amazon-web-services amazon-ecs docker

5
推荐指数
1
解决办法
704
查看次数

Spring Boot测试:是否为每个测试加载了上下文?

在我的项目中,我们所有的测试都有一个超类。这是那个班级的签名

@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {
Run Code Online (Sandbox Code Playgroud)

其中Application.class是我们的主类,而SomeConfiguration.class则仅用于一些@Bean和其他内容,没有什么花哨的地方。

我使用gradle,并且为了运行测试,我这样做:

./gradlew :my-project:test
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 我不确定是否针对每个测试都在初始化上下文。但是我可以确保上下文被多次初始化。我通过查看日志知道这一点。
  • 由于初始化了多个上下文,因此上下文似乎相互重叠。我知道这是因为症状之一是此异常:

    Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
    
    Run Code Online (Sandbox Code Playgroud)
  • 即使我不关心加载的多个上下文,我的印象是,当一个测试完成时,下一个测试会在终止前一个测试之前获得一个新的上下文。我之所以这样说,是因为上面的异常重叠了。

由于所有测试共享同一个JVM,因此当某些bean被两次注册时,该异常就会出现。从此链接:

上下文缓存

据说:

可以通过用于加载它的配置参数的组合来唯一标识ApplicationContext。因此,配置参数的唯一组合用于生成一个密钥,在该密钥下缓存上下文。TestContext框架使用以下配置参数来构建上下文缓存键

我了解这一点,但是,我想知道如何实现?我的目标是在同一个JVM上运行所有测试,并在每个测试中重用上下文。

2月22日星期四编辑

我尝试过的事情:

  • spring.jmx.enabled:假
  • spring.jmx.default-domain:一些值

真正的禁用JMX应该无济于事,因为它的执行范围是Spring Cloud的EnvironmentManager。

java junit spring spring-boot spring-boot-test

5
推荐指数
1
解决办法
1万
查看次数

无法从表中删除UNIQUE索引

当我运行此查询时

ALTER TABLE "dbo"."ROOM" DROP INDEX "UNIQUE";
Run Code Online (Sandbox Code Playgroud)

我收到了这条消息:

错误1018:'INDEX'附近的语法不正确.如果这是作为表提示的一部分,则现在需要A WITH关键字和括号.有关正确的语法,请参阅SQL Server联机丛书.

正确地说,唯一索引的名称UNIQUE.我认为这是问题,它是一个自动生成的名称(用于创建此索引的SQL Server客户端).这是创建表句子:

CREATE TABLE "ROOM" (
    "ID" BIGINT NOT NULL DEFAULT NULL,
    //the rest of the columns...
    "ROOM" VARCHAR(100),
    UNIQUE INDEX "UNIQUE" ("ROOM")
)
;
Run Code Online (Sandbox Code Playgroud)

知道怎么能删除这个索引?我知道我可以放下桌子,再次创建它,我想避免这样做.

sql sql-server unique-index

2
推荐指数
1
解决办法
1万
查看次数