Java 无法使用spring JpaRepository持久化数据

Java 无法使用spring JpaRepository持久化数据,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我创建了一个简单的3实体数据模型,当试图持久化数据时,它不起作用。 以下是实体及其id类服务器: @Entity @Data public class Server { @Id private String name; private String serverUrl; @OneToMany(mappedBy = "server", fetch = FetchType.LAZY) private List<Service> service

我创建了一个简单的3实体数据模型,当试图持久化数据时,它不起作用。 以下是实体及其id类服务器:

@Entity
@Data
public class Server {

    @Id
    private String name;

    private String serverUrl;

    @OneToMany(mappedBy = "server", fetch = FetchType.LAZY)
    private List<Service> services;
}
我尝试使用ServiceRepository:

public interface ServiceRepository extends JpaRepository<Service, ServiceId>    {
}
public interface servicepository扩展了JpaRepository{
}
要持久化服务对象,请执行以下操作:

public class SomeClass{

    @Autowired
    ServiceRepository serviceRepository;

    @Transactional
    public void insertServices(Service service) {
        serviceRepository.save(service); <- Exception HERE!
    }
}
公共类SomeClass{
@自动连线
服务库服务库;
@交易的
公共void插入服务(服务){
serviceRepository.save(service);jpa->show sql在application.yml中设置为true,这样我就可以在失败之前获得此日志:

休眠:从服务器server0中选择server0\u.name作为名称1\u 1\u,选择server0\u.server\u url作为服务器\u u2\u 1\u_

创建的数据库似乎还可以:


在当前项目中,我也遇到了类似复合键的问题。
也许我错了,但对我来说,
@IdClass
只有在
@Id
注释的属性都不是外键的情况下才有效。 我最终使用
@EmbeddedId
重构了实体

实际上,我还有一个想法:尝试将
@ManyToOne
注释添加到
ServiceId
类中的
server
属性:

public class ServiceId implements Serializable {

    private String name;

    @OneToMany(mappedBy = "service", fetch = FetchType.EAGER)
    private Server server;
}

在我当前的项目中,我也遇到了类似复合键的问题。
也许我错了,但对我来说,
@IdClass
只有在
@Id
注释的属性都不是外键的情况下才有效。 我最终使用
@EmbeddedId
重构了实体

实际上,我还有一个想法:尝试将
@ManyToOne
注释添加到
ServiceId
类中的
server
属性:

public class ServiceId implements Serializable {

    private String name;

    @OneToMany(mappedBy = "service", fetch = FetchType.EAGER)
    private Server server;
}

你的回复是错误的。出于某种原因,你有一个组合Id而不是字符串。为什么你需要一个组合Id(而你显然不希望名称是唯一的,如果不是的话,你的
findByName
就没有意义了)。另外,请发布完整的stacktrace,而不仅仅是一个片段,并确保你正确设置了属性(它们是双向的,因此应设置两侧).Thank@M.Deinum,你说得对。我修复了存储库,但仍然收到相同的错误。我需要compose id,因为来自两台服务器的两个服务可以具有相同的名称。容器也是如此,来自两个服务的两个容器可以具有相同的名称。服务中的容器也按其应指向服务。更新了完整的AckTrace您的回复是错误的。出于某种原因,您有一个组合Id而不是字符串。为什么您需要一个组合Id(而您显然不希望名称是唯一的,如果不是您的
findByName
没有意义的话)。另外,请发布完整的stacktrace,而不仅仅是一个片段,并确保您正确设置了属性(它们是双向的,因此应设置两侧).Thank@M.Deinum,你说得对。我修复了存储库,但仍然收到相同的错误。我需要compose id,因为来自两台服务器的两个服务可以具有相同的名称。容器也是如此,来自两个服务的两个容器可以具有相同的名称。服务中的容器也按其应指向服务。更新了完整的与id类的AckTraceReading关系不起作用。将尝试使用EmbeddedId和update。ThanksEmbeddedId也不起作用。最终更改数据模型:\n向id类添加关系不起作用。将尝试使用EmbeddedId和update。ThanksEmbeddedId也不起作用。最终更改数据模型:\
public class ServiceId implements Serializable {

    private String name;

    @OneToMany(mappedBy = "service", fetch = FetchType.EAGER)
    private Server server;
}