有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java sql使用spring jpa(外键null)一对多更新

我正在使用spring bootJava11jpa

我有两个表,条目和条目名称。我想更新第二个表中的条目及其后续多对一关系(条目名称)

问题: Entry_id字段始终为空,因此它会在Entry_名称中创建新条目,而不是更新它们。我做错了什么?这是我最新的代码:

表格:

+-------+
| Entry |
+-------+
| id    | pk:id
| title |
| text  |
+-------+

+-----------+
|entry_names| 
+-----------+
| id        | pk: id 
| name      | fk: entry_id -> entry(id)
| entry_id  |
+-----------+

这些实体是:

条目:

@Entity
@Table(name="entry")
@Getter
@Setter
public class Entry {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;
    private String title;
    private String text;
    
    @OneToMany(
            fetch = FetchType.EAGER,
            mappedBy = "entry",         
            cascade = CascadeType.ALL, 
            orphanRemoval = true)
    private Set<EntryNames> names;
}

条目名称

@Entity
@Table(name="entry_names")
@Getter
@Setter
public class EntryNames {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "entry_id")
    private Entry entry;

    @Column(name = "name")
    private String name;
}

代码:

@Override
@Transactional
public boolean update(EntryDto dto) {
    
    try {
        Optional<Entry> findEntry = dao.findById(entry.getId());
        if (findEntry.isPresent()) {
            Entry entry = findEntry.get();
            
            Set<EntryNames> entryNames = new HashSet<>();
            entry.getName().forEach(entryNames -> entryNames.add(new EntryName(entryName)));
            entryNames.forEach(entryName -> entryName.setId(entry.getId()));
            entry.setName(entryNames);
            dao.save(entry);
            return true;
        }
        return false;
    } catch (Exception exception) {
        logger.error("ERROR: {}", exception.getMessage());
        return false;
    }
}   

(编辑以删除分配,仍然是相同的问题)


共 (1) 个答案

  1. # 1 楼答案

    您正在使用新的HashSet设置名称<&燃气轮机;(); 这将覆盖这些值

    改为:

      private Set<EntryNames> names ;
    

    也可以在更新方法中添加此项

     entrynames.setEntry(entry)