当前位置: 首页 > 知识库问答 >
问题:

JPA@MapsId插入不正确的列名

徐秋月
2023-03-14

尽管遵循了网络上的所有示例,但我很难让@MapsId工作。

这是我的设置:

pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.5.Final</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

DDL脚本:

CREATE TABLE Subscription (
    id bigint not null primary key auto_increment,
    active boolean not null,
    maxNumUsers int not null
)ENGINE=InnoDB;

CREATE TABLE t.Project (
    name varchar(32) not null,
    subscriptionId bigint not null
)ENGINE=InnoDB;

ALTER TABLE t.Project ADD CONSTRAINT `projectPK` PRIMARY KEY (name, subscriptionId);
ALTER TABLE t.Project ADD CONSTRAINT `projectSubscriptionFK` FOREIGN KEY (subscriptionId) REFERENCES t.Subscription(id);

ProjectId.java:

@Embeddable
public class ProjectId implements Serializable {
    private Long subscriptionId;
    private String name;

Project.java:

@Entity
@Table(schema = "t")
public class Project {
    @EmbeddedId
    private ProjectId id;

    @ManyToOne
    @MapsId("subscriptionId")
    //@JoinColumn(name = "subscriptionId", referencedColumnName = "id", insertable = false, updatable = false)
    private Subscription subscription;

订阅.java:

@Entity
@Table(schema = "t")
public class Subscription {

    @OneToMany(mappedBy = "subscription", cascade = CascadeType.ALL)
    private Map<ProjectId, Project> projects = new HashMap<>();

当我进行插入时,会发生以下错误:

Hibernate:插入t。项目(name,subscription_id)值(?,?)2014年7月20日11:06:59193 org.hibernate.engine.jdbc.spi。SqlExceptionHelper-SQL错误:1054,SQLState:42S22 2014-07-20 11:06:59193 org.hibernate.engine.jdbc.spi。SqlExceptionHelper-“字段列表”中的未知列“subscription_id”

...94 更多 由: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException subscription_id: un.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) atcom.mysql.jdbc.Util.handleNewInstance(Util.java:408) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1062) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) ...114 更多

如果我取消注释Project上的@JoinColumn。订阅和重新部署我收到以下错误:

...21 更多 原因: org.hibernate.MappingException: 映射中的重复列 for collection: t.Subscription.projects 列: subscriptionId

我也尝试删除@MapsId,但我仍然收到重复的列错误。

我对如何解决这个问题感到困惑。任何建议将不胜感激。

谢谢

更新:如果我使Subscription.projects成为一个列表而不是一个地图,并且我将JoinColumn添加到project.subscription,它就工作了。但是,如果我将subscription.projects改回map,我又开始得到org . hibernate . mapping exception:Repeated列。显然,我真的很想用这张地图,所以我会继续挖掘。

共有3个答案

皇甫逸清
2023-03-14

我认为你需要一个@属性覆盖来覆盖默认的连接列名:

@EmbeddedId
@AttributeOverride(name="subscriptionId", column=@Column(name="subscriptionId"))
private ProjectId id;
鞠隐水
2023-03-14

好的,所以问题是我需要将@MapKey添加到订阅项目,否则当我添加@JoinColumn时,它会抱怨“org.hibernate.MappingException:重复列”

感谢您的建议

以下是最终代码:

@Embeddable
public class ProjectId implements Serializable {
    private Long subscriptionId;
    private String name;

@Entity
@Table(schema = "t")
public class Project {
    @EmbeddedId
    private ProjectId id;

    @ManyToOne
    @MapsId("subscriptionId")
    @JoinColumn(name = "subscriptionId", referencedColumnName = "id", insertable = false, updatable = false)
    private Subscription subscription;


@Entity
@Table(schema = "t")
public class Subscription {

    @OneToMany(mappedBy = "subscription", cascade = CascadeType.ALL)
    @MapKey(name = "id")
    private Map<ProjectId, Project> projects = new HashMap<>();
燕智
2023-03-14

使用mapsId注释时,指定关系共享并控制由Id映射映射的字段,因此关系映射中的字段将覆盖Id映射中的域。这意味着JPA将使用subscription_id默认值,除非您指定注释掉的联接列:

@JoinColumn(name = "subscriptionId", referencedColumnName = "id")
 类似资料:
  • 问题内容: 我使用JPA进行数据库访问,并用正确的名称注释了每一列。现在,如果我执行查询(例如),它将返回 错误消息是正确的,未知,因为真实名称是。 型号:程序 标签 询问 JPA是否有理由将“ programId”更改为“ program_id”,或者我缺少任何配置? 谢谢 编辑:抱歉,忘记添加查询代码/信息。 我使用Spring Data的界面并尝试了查询。 问题答案: 如spring-boo

  • 模型:程序 标签 查询

  • 我试图在JPA2.1中保存一个实体。我有三个表--MVCollection、MVCollectionVersion(它是MVCollection的版本)和MVBelomsCollection(它是属于一个版本的项)。MVCollection的主键是生成的序列号。当我生成一个带有版本(不包含任何项)的集合时,我使用@mapsid,生成的ID在子级中使用。然而,我似乎不能理解我如何能复制这与项目。 M

  • 问题内容: 好的,所以我一直在研究Steam Web API,我将其中一个值存储在名为的变量中。当我使用此代码片段将其插入到mysql数据库中时,它会插入一个与存储在变量中不同的整数。 返回真实的int,回显它也是如此。不太确定这里发生了什么,我们将不胜感激。 问题答案: 可能是因为您将查询用双引号引起来,但是变量用单引号引起来,因此将其视为文字,并且如果该列是int,则将得到0。 尝试这个: 另

  • 问题内容: 我是学生,这是家庭作业…表格在那里,但没有插入数据。 感谢您的任何建议 SQL语句: 问题答案: 您在其中没有子句(“ Ledonna”之后的子句) 请注意,如果您双击Management Studio中的错误消息,它将带您进入代码的问题位。

  • 问题内容: 我正在尝试实现基本的用户/角色 用户可以具有零到多个角色。 我的单元测试 问题是,jpa(由hibernate支持)没有在USER_ROLES表上进行插入(正在正确创建它,并且具有正确的复合PK(ROLE,USER_ID)和FK给用户)。 我可以在控制台中看到,用户只完成了一次插入 我想我只是缺少一些简单的东西。 问题答案: 收集元素在持久性上下文刷新期间插入数据库中。默认情况下,测试