【问题标题】:idMoneda property not updated in DB with @Transient directiveidMoneda 属性未在 DB 中使用 @Transient 指令更新
【发布时间】:2021-05-07 10:41:23
【问题描述】:

我有这个实体,我在其中创建了一个 PUT 和 POST 方法,它们不会给出错误,但仍然是 idMoneda,这是一个使用 @Transient 计算的属性,因为它是 moneda 的 ID(其中有与另一个表的 1 对 1 关系),它不会更新我,当我查看数据库时它仍然为空,即使在 POST 请求中我输入了一个值。我不知道是因为 setter 错误,还是只是需要添加我现在看不到的其他内容。

@Entity
@Table(name = "REMESA")
public class Remesa {

    @Id
    @SequenceGenerator(name = "remesa_sequence", sequenceName = "remesa_sequence", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "remesa_sequence")
    @Column(name = "ID")
    private Long id;

    @OneToOne
    @JoinColumn(name = "moneda", nullable = true)
    @JsonIgnore
    private Moneda moneda;


    @Transient
    @JsonProperty("moneda")
    private Long idMoneda;

    public Long getIdMoneda() {
            return this.moneda.getId();
        }
    
        public void setIdMoneda(Long idMoneda) {
            this.idMoneda = idMoneda;
        }

}

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    @Transient 在 JPA 中的意思是:不要将此字段保存在 DB 中。如果定义明确,您的关系将自动生成名为“moneda_id”的列

    【讨论】:

    • 是的,我有一个 moneda_id 列,但是当我在执行 POST 或 PUT 时不会添加或更新,只需在 moneda_id 列的 db 中放置一个 NULL
    【解决方案2】:

    Java的transient关键字用来表示一个字段不被序列化,而JPA的@Transient注解用来表示一个字段不被持久化到数据库中,即它们的语义不同。因为它们有不同的含义。

    所以尝试删除瞬态注释并运行您的代码。

    【讨论】:

    • 我做到了,但现在它正在生成一个名为 id_moneda 的新列,而不是 moneda_id。现在有 2 列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多