Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中创建多个子实体时,如何仅创建一次父实体?_Java_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java 在hibernate中创建多个子实体时,如何仅创建一次父实体?

Java 在hibernate中创建多个子实体时,如何仅创建一次父实体?,java,hibernate,spring-boot,spring-data-jpa,Java,Hibernate,Spring Boot,Spring Data Jpa,我有一个用户类和一个注释类,定义如下: @Entity @Table(name = "notes") public class Note { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column private String title; @Column private String content; @ManyToOne

我有一个用户类和一个注释类,定义如下:

@Entity
@Table(name = "notes")
public class Note {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String title;
    @Column
    private String content;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

// getters and setters
}


@Entity
@Table(name="users")
public class User {
    @Id
    @Column
    private int id;
    @Column
    private String name;
    @Column
    private String userName;

 //getters and setters
}
[{
    "title": "Mynote",
    "content": "This is another note",
    "user": {
        "id": 4,
        "name": "user_1",
        "userName": "S"
    }
}]
我正在尝试创建一个“注释”,我想要实现的是,作为我的请求负载的一部分,我将通过id传递我的用户详细信息,如下所示:

@Entity
@Table(name = "notes")
public class Note {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String title;
    @Column
    private String content;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

// getters and setters
}


@Entity
@Table(name="users")
public class User {
    @Id
    @Column
    private int id;
    @Column
    private String name;
    @Column
    private String userName;

 //getters and setters
}
[{
    "title": "Mynote",
    "content": "This is another note",
    "user": {
        "id": 4,
        "name": "user_1",
        "userName": "S"
    }
}]
我希望,如果“User”已经存在,它不应该用新条目更新users表,如果给定id的用户不存在,它应该创建一个新条目并将该条目链接到notes

为此,我使用了
@ManyToOne(cascade=CascadeType.ALL)
,在“Notes”类中的
私有用户
字段上方。 它对一个请求有效,但对下一个请求抛出

java.sql.SQLIntegrityConstraintViolationException: 
   Duplicate entry '5' for key 'PRIMARY'
这是预期的,因为它尝试插入同一行两次

我可以在spring或od中使用一些注释来实现这一点吗?我必须在自己的代码中处理这一点:在创建注释时,我必须检查用户是否存在,如果不存在,然后创建一个新的用户,然后保存注释


(基本上,如果有支持的话,这就是我想使用hibernate/spring data jpa实现的)。

有关更多技术细节,请查看@Chinthaka Dinadasa在您的问题下提供的链接

要获得快速、简单的解决方案,请从另一个角度考虑。让我们向用户添加注释并保存此用户(而不是注释)

用户实体

@实体
@表(name=“users”)
公共类用户{
@身份证
私有整数id;
@OneToMany(mappedBy=“user”,cascade=CascadeType.ALL)/!!!添加“cascade”
私有列表注释=新的ArrayList();
注释实体

@实体
@表(name=“note\u Table”)
公开课堂讲稿{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@许多酮
@JoinColumn(name=“user\u id”)
私人用户;
现在,如果您尝试在某些
@Service
中调用以下方法两次,则该用户将有一个用户和两个注释:

@服务
公共类MyService{
@自动连线
私有用户存储库用户存储库;
@交易的
公共无效接受newnote(){
用户=新用户();
用户设置ID(0L);
注释=新注释();
user.setNotes(Arrays.asList(note));
userRepository.save(用户);
其中UserRepository是:

public interface UserRepository扩展了crudepository

有关更多技术细节,请查看@Chinthaka Dinadasa在您的问题下提供的链接

为了快速简便的解决方案,请从另一个角度考虑。让我们向用户添加注释并保存此用户(而不是注释)

用户实体

@实体
@表(name=“users”)
公共类用户{
@身份证
私有整数id;
@OneToMany(mappedBy=“user”,cascade=CascadeType.ALL)/!!!添加“cascade”
私有列表注释=新的ArrayList();
注释实体

@实体
@表(name=“note\u Table”)
公开课堂讲稿{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@许多酮
@JoinColumn(name=“user\u id”)
私人用户;
现在,如果您尝试在某些
@Service
中调用以下方法两次,则该用户将有一个用户和两个注释:

@服务
公共类MyService{
@自动连线
私有用户存储库用户存储库;
@交易的
公共无效接受newnote(){
用户=新用户();
用户设置ID(0L);
注释=新注释();
user.setNotes(Arrays.asList(note));
userRepository.save(用户);
其中UserRepository是:

public interface UserRepository扩展了crudepository

请显示存储库的代码。如何保存用户?检查此问题。请显示存储库的代码。如何保存用户?检查此问题。