【问题标题】:JPA - ManyToOne - JoinTable - cannot update a fieldJPA - ManyToOne - JoinTable - 无法更新字段
【发布时间】:2017-01-15 18:30:01
【问题描述】:

我有以下情况:

AnagraficaIscritti.java

@Entity
@Table(name="ANAGRAFICA_ISCRITTI")
public class AnagraficaIscritti implements Serializable {
        private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID_EMAIL",insertable=false, updatable=false)
    private long idEmail;

    private String email;

    //bi-directional many-to-many association to Newsletter 
    @ManyToMany(mappedBy="anagraficaIscrittis")
    private List<Newsletter> newsletters;

    //bi-directional many-to-one association to IscrizioniEmail
    @OneToMany(mappedBy="anagraficaIscritti")
    private List<IscrizioniEmail> iscrizioniEmails;

Newsletter.java

@Entity
@Table(name="NEWSLETTER")
public class Newsletter implements Serializable {
        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="ID_NEWSLETTER")
        private long idNewsletter;

        //bi-directional many-to-many association to AnagraficaIscritti
        @ManyToMany
        @JoinTable(
            name="ISCRIZIONI_EMAIL"
            , joinColumns={
                @JoinColumn(name="ID_NEWSLETTER")
                }
            , inverseJoinColumns={
                @JoinColumn(name="ID_EMAIL")
                }
            )
        private List<AnagraficaIscritti> anagraficaIscrittis;

        //bi-directional many-to-one association to IscrizioniEmail
        @OneToMany(mappedBy="newsletter")
        private List<IscrizioniEmail> iscrizioniEmails;

IscrizioniEmail.java

@Entity
@Table(name="iscrizioni_email")
public class IscrizioniEmail implements Serializable {
        private static final long serialVersionUID = 1L;


        @EmbeddedId
        private IscrizioniEmailPK id;

        @Temporal(TemporalType.TIMESTAMP)
        @Column(name="SUBSCRIPTION_DATE")
        private Date subscriptionDate;

        //bi-directional many-to-one association to AnagraficaIscritti
        @ManyToOne
        @JoinColumn(name="ID_EMAIL",insertable = false, updatable = false)
        private AnagraficaIscritti anagraficaIscritti;

        //bi-directional many-to-one association to Newsletter
        @ManyToOne
        @JoinColumn(name="ID_NEWSLETTER", insertable = false, updatable = false)
        private Newsletter newsletter;

IscrizioniEmailPK.java

@Embeddable
public class IscrizioniEmailPK implements Serializable {
        //default serial version id, required for serializable classes.
        private static final long serialVersionUID = 1L;

        @Column(name="ID_EMAIL", insertable=false, updatable=false)
        private long idEmail;

        @Column(name="ID_NEWSLETTER", insertable=false, updatable=false)
        private long idNewsletter;

当我尝试创建 Object AnagraficaIscritti 和 Object Newsletter 时,也会在 IscrizioniEmail 中自动插入一条记录。例如我创建:

 ANAGRAFICA_ISCRITTI
 ID_EMAIL           EMAIL
  1           john.doe@gmail.com

 NEWSLETTER
 ID_NEWSLETTER      NEWSLETTER
      1               sport

 ISCRIZIONI_EMAIL
  ID_EMAIL   ID_NEWSLETTER   SUBSCRIPTION_DATE
     1             1               NULL

但是更新 SUBSCRIPTION_DATE(使用当前时间戳)的正确方法是什么,它是空的?如果我尝试创建一个 Object IscrizioniEmail,我会遇到重复的键错误等等。

【问题讨论】:

  • 您是否尝试过创建@EntityIscrizioniEmail
  • 我不明白。实体类 IscrizioniEmail 存在。
  • 谢谢,定义默认值有效:SUBSCRIPTION_DATEDATETIME DEFAULT NOW() 我认为 JPA 有时非常复杂。

标签: java jpa jointable


【解决方案1】:

您可以在ISCRIZIONI_EMAIL 表中为SUBSCRIPTION_DATE 设置默认值,该值将是当前日期。这样您就不需要从 Java 发送它。

如果您需要从 Java 发送该值,则可以在插入 NewsletterAnagraficaIscritti 表之后使用 IscrizioniEmail 实体类执行更新查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2018-03-29
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多