繁体   English   中英

sql使用spring jpa更新一对多(外键为空)

[英]sql update one to many using spring jpa (foreign key null)

我正在使用spring bootjava 11jpa

我有 2 个表,entry 和 entry_names。 我想在第二个表(entry_names)中更新一个条目及其后续的多对一关系。

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

表格:

+-------+
| 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;
    }
}   

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

您正在使用 new HashSet<>(); 设置名称。 这将覆盖这些值。

改成:

  private Set<EntryNames> names ;

Aslo在更新方法中添加这个

 entrynames.setEntry(entry)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM