簡體   English   中英

JPA復合鍵(FK +日期)將日期設置為auto_increment

[英]JPA composite key (FKs + date) set date to auto_increment

我正在研究Java Play項目,並嘗試為項目中的用戶創建時間跟蹤器。 我有以下課程來跟蹤時間:

@Entity(name = "trackings")
public class Tracking extends Model {

    @EmbeddedId
    public TrackingPK id;

    @ManyToOne
    @MapsId("user")
    @JoinColumn(name="user", referencedColumnName="id")
    public User user;

    @ManyToOne
    @MapsId("project")
    @JoinColumn(name="project", referencedColumnName="id")
    public Project project;

    @Required
    @Enumerated(EnumType.STRING)
    public ETrackingDuration duration;

    @Embeddable
    public class TrackingPK implements Serializable {
        @ManyToOne
        @JoinColumn(name = "user_id", referencedColumnName = "id", insertable = false, updatable = false)
        private User user;

        @ManyToOne
        @JoinColumn(name = "project_id", referencedColumnName = "id", insertable = false, updatable = false)
        private Project project;

        @Column(name="date", columnDefinition="DATE NOT NULL")
        @Temporal(TemporalType.DATE)
        private Date date;
    }
}

不幸的是,JPA一直將日期作為auto_increment ,我不知道為什么。

這是我的日志:

09:14:16,939 ERROR ~ HHH000388: Unsuccessful: create table trackings (date datetime not null auto_increment, project_id bigint not null, user_id bigint not null, id bigint not null, duration varchar(255), primary key (date, project_id, user_id, id)) ENGINE=InnoDB DEFAULT CHARSET=utf8
09:14:16,939 ERROR ~ Incorrect column specifier for column 'date'
09:14:16,941 ERROR ~ HHH000388: Unsuccessful: alter table trackings add index FK_fjady3y2u9ej76atpce4djsu5 (project_id), add constraint FK_fjady3y2u9ej76atpce4djsu5 foreign key (project_id) references projects (id)
09:14:16,941 ERROR ~ Table 'trackings' doesn't exist
09:14:16,944 ERROR ~ HHH000388: Unsuccessful: alter table trackings add index FK_rdi49oyr8mro9t6vjj5towo0b (user_id), add constraint FK_rdi49oyr8mro9t6vjj5towo0b foreign key (user_id) references users (id)

外鍵是正確的,但不是date ...

我可以看到映射有幾個問題:

  • 您分別在Tracking.userTracking.project上需要@MapsId("user")@MapsId("project")
  • 在適當的位置使用@MapsIdTrackingPK.userTrackingPK.project上的@Column注釋是多余的(如果在JPA中兩次定義同一列,而沒有在其中一個聲明它為insertable=false, updatable=false ,則可能會遇到問題。定義)
  • 只要時間類型設置為TemporalType.DATE JPA就會允許java.util.Date (請參閱: https : //docs.oracle.com/javaee/7/tutorial/persistence-intro001.htm ;您的JPA提供程序可能會允許它,但是,您需要檢查)

關於架構定義問題,如果其他所有方法均失敗,請嘗試使用columnDefinition="date not null"覆蓋該列的默認SQL。

編輯事實證明play.db.jpa.Model定義了一個@Id列。 導致問題的原因是混合使用@Id@EmbeddedId 您將需要從play.db.jpa.GenericModel擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM