【问题标题】:JPA composite key (FKs + date) set date to auto_incrementJPA 复合键 (FKs + date) 将日期设置为 auto_increment
【发布时间】:2018-03-30 09:25:20
【问题描述】:

我正在开发一个 Java 游戏项目,并尝试为项目中的用户创建一个时间跟踪器。我有以下跟踪时间的课程:

@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...

【问题讨论】:

    标签: java jpa playframework


    【解决方案1】:

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

    • Tracking.userTracking.project 分别需要 @MapsId("user")@MapsId("project")
    • TrackingPK.userTrackingPK.project 上的 @Column 注释与 @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 扩展。

    【讨论】:

    • 我已根据您的建议更新了我的问题。尽管如此,日期仍被创建为auto_increment
    • 哪个 JPA 提供商?
    • 没关系,我可以从日志中看到它是休眠状态。您确定您在persistence.xml 中配置了正确的方言(例如<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>)吗?
    • 另外,额外的id 列是从哪里来的?你会碰巧在Model 类中声明一个@Id 吗?不允许混合使用 @Id@EmbeddedId。我会尝试删除继承Tracking -> Model 看看是否能解决问题
    • 在这个版本的 Play 中,您需要从 play.db.jpa.GenericModel 扩展而不是 play.db.jpa.Model。是 play.db.jpa.Model 添加了 id 字段
    猜你喜欢
    • 2020-08-25
    • 2011-09-05
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多