代码之家  ›  专栏  ›  技术社区  ›  Anthony PERIQUET

JPA复合键(FKs+日期)将日期设置为auto\u increment

  •  0
  • Anthony PERIQUET  · 技术社区  · 7 年前

    我正在从事一个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 。。。

    1 回复  |  直到 7 年前
        1
  •  0
  •   crizzis    7 年前

    我可以看到映射有几个问题:

    • 你需要 @MapsId("user") @MapsId("project") 在…上 Tracking.user Tracking.project 分别地
    • 这个 @Column 批注位于 TrackingPK.user TrackingPK.project 与冗余 @MapsId 就地(如果在JPA中两次定义同一列,而不声明它,实际上可能会遇到问题 insertable=false, updatable=false 在其中一个定义中)
    • JPA允许 java.util.Date 只要时间类型设置为 TemporalType.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 相反

    推荐文章