[英]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.user
和Tracking.project
上需要@MapsId("user")
和@MapsId("project")
@MapsId
, TrackingPK.user
和TrackingPK.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.